使用Python连接数据库构建一个搜索引擎
但是代码一直报错
# 以后操作flask通过Flask去操作
from flask import Flask,render_template,request
# 导入操作数据库的模块
from flask_sqlalchemy import SQLAlchemy
import requests
from sqlalchemy import or_,and_
import time
# app: 看成是服务器对象 通过app来操作服务器
app = Flask(__name__)
# 服务器操作数据库
# 配置参数
class Config:
SQLALCHEMY_DATABASE_URI = "mysql://root@localhost:3306/shousuo"
# 设置sqlalchemy自动更跟踪数据库
SQLALCHEMY_TRACK_MODIFICATIONS = True
# 进行app配置
app.config.from_object(Config)
db = SQLAlchemy(app)
# 新闻的数据库表
# 创建模型类
class News(db.Model):
# 表名
__tablename__ = 'news'
# 字段 (名字和类型)
id = db.Column(db.Integer,primary_key=True)
# 新闻标题
title = db.Column(db.String(255))
# 作者
author = db.Column(db.String(255))
# 作者头像
icon = db.Column(db.String(255))
# 时间
time = db.Column(db.String(255))
# 图片
img = db.Column(db.String(255))
# 新闻详情页链接
detailUrl = db.Column(db.String(255))
# 写好路由
# 首页
@app.route('/')
def index():
# return 'Hello World!11111'
# 返回一个完整的网页 前提: 网页文件一定是在templates文件夹 render_template(网页文件名)
return render_template('index.html')
# 查找的路由: /search?wd=bbb&page=1
@app.route('/search')
def search():
# 获取接口的参数
# 把接口的参数转化为字典
args = request.args.to_dict()
# 先获取关键字
word = args['wd']
# 获取当前页码
# 查看是否有page,如果没有,默认为1
page = int(args.get('page') or 1)
# page = int(args['page'])
# 每页给前端返回几条数据
size = 20
# 分页查询
# page: 第几页的数据
# per_page: 每页几条数据
result = News.query.filter(or_(News.title.like('%'+word+'%'), News.author.like('%'+word+'%'))).paginate(page=page, per_page=size,error_out=False)
# 存储多条数据的列表
dataList = []
# 获取到每条数据
for i in result.items:
# i: 每条数据
# 将时间戳转化为时间
# 时间戳 把毫秒转化为秒 1s = 1000ms
a = int(i.time) // 1000
# 将时间戳转化为时间元组对象
timeTuple = time.localtime(a)
# 将时间元组进行格式化: 按照某种格式显示时间
# 年-月-日 时:分:秒 2021-11-25 15:57:00
# %Y-%m-%d %H:%M:%S
timeStr = time.strftime('%Y-%m-%d %H:%M:%S', timeTuple)
# 构建每条数据的字典
dic = {
'title': i.title,
'author': i.author,
'icon': i.icon,
'time': timeStr,
'img': i.img,
'detailUrl': i.detailUrl,
}
# 加入到列表当中
dataList.append(dic)
# print(dataList)
# 3.总结果数
# print(result.total)
# 4.总页数
# print(result.pages)
# 需要返回的数据:
# 1.数据库表中的每条数据
# 2.当前页数
# 3.总结果数
# 4.总页数
# 最终传递给前端的数据
resultDic = {
'data': dataList,
# 当前页数
'page': page,
# 总数据量
'total': result.total,
# 总页数
'totalPage': result.pages,
# 当前搜索的内容
'word': word
}
return render_template('search_template.html',data=resultDic)
if __name__ == '__main__':
# 启动服务器
app.run()
但是结果一直报错,不知道怎么更改
问题点: 项目运行时,找不到模板,导致TemplateNotFound错误.
原理: 在项目下创建 templates 文件夹,将模板放到该文件夹下,project会自动从该文件夹下取模板
解决办法:
①确认项目下, templates 文件夹是否有index.html文件,如果没有就创建一个index.html.
②如果templates 文件夹存在index.html文件,那就是项目运行时出现查找问题,将文件名改成文件的绝对路径.
一个简单的FlaskWeb程序,提供Motion JPEG流,注意Motion JPEG应用广泛。这种方法延迟低,但质量不是最好的,因为 JPEG 压缩对于运动视频不是很有效。
从摄像机中获取视频帧:
from time import time
class Camera(object):
def __init__(self):
self.frames = [open(f + '.jpg', 'rb').read() for f in ['1', '2', '3']]
def get_frame(self):
return self.frames[int(time()) % 3]
上面一部分代码是实例,针对没有摄像头设备的进行调试,通过在读取工程下面的图像来构建图像流。
#!/usr/bin/env python
from flask import Flask, render_template, Response
from camera import Camera
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
def gen(camera):
while True:
frame = camera.get_frame()
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')
@app.route('/video_feed')
def video_feed():
return Response(gen(Camera()),
mimetype='multipart/x-mixed-replace; boundary=frame')
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True)
此应用程序定义了一个Camera
负责提供帧序列的类。前端HTML内容:
<html>
<head>
<title>Video Streaming Demonstration</title>
</head>
<body>
<h1>Video Streaming Demonstration</h1>
<img src="{{ url_for('video_feed') }}">
</body>
</html>
video_feed
路由中调用gen
生成器函数,该函数调用```Camera``类来获取视频流。整个流程都是比较简单。然而使用流也有一些限制,当Flask应用程序处理常规请求的时候,请求周期很短。Web Worker接受请求,调用处理函数并最终返回响应给客户端。当客户端接收到的是流,那么需要在流传输期间,客户端要保持连接。另一方面当客户端断开连接的时候,服务端可能也在一直给客户端提供服务,难以关闭流的传输,同时该服务只能提供给相同Web Worker数的客户端。有一些方法能够克服以上的问题,那就是使用协程或者多线程。接下来看看如何对上面的程序进行优化。