Flask是什么?
Flask是目前十分流行的web框架,采用Python编程语言来实现相关功能。它被称为微框架(microframework),“微”并不是意味着把整个Web应用放入到一个Python文件,微框架中的“微”是指Flask旨在保持代码简洁且易于扩展,Flask框架的主要特征是核心构成比较简单,但具有很强的扩展性和兼容性,程序员可以使用Python语言快速实现一个网站或Web服务。
Flask主要包括Werkzeug
和Jinja2
两个核心函数库,它们分别负责业务处理和安全方面的功能,这些基础函数为web项目开发过程提供了丰富的基础组件。目前Python的web框架有很多。除了Flask,还有django、Web2py等等,其中Diango是目前Python的框架中使用度最高的,flask的很多模板也是模仿Diango的。
Flask的基本模式
Flask的基本模式为在程序里将一个视图函数分配给一个URL,每当用户访问这个URL时,系统就会执行给该URL分配好的视图函数,获取函数的返回值并将其显示到浏览器上,其工作过程见图 。
其中的WSGI是Web服务器和Web框架(这里是Flask)的接口,常常用于处理动态内容。Werkzeug是一个WSGI的工具包,可以作为Web框架的底层库,它已经封装好了很多内容,如图中的Request,Response,可以减轻web框架开发的工作量。
由于Flask轻量,开发应用简便,所以它扩展性极强,给用户提供了很大的选择空间。
- 支持各种关系数据库
- 支持图数据库Neo4J
- 扩展功能交由第三方开发
官方文档:Welcome to Flask — Flask Documentation (2.0.x) (palletsprojects.com)
下面开始上手吧!!
安装Flask
:pip install flask
初始化一个项目
:Hello.py
from flask import Flask
app = Flask(__name__) //生成一个Flask对象
@app.route('/') //路由的作用在于给它一个url,对应分配好的视图函数
#路由的参数还可以设置成动态的
def index(): //视图函数
return '<h1>Hello World!</h1>'
if __name__ == '__main__':
app.run(debug=True) //调用run启动Flask集成的开发Web服务器
运行结果
:
-
进阶——jinja2
Jinja2是Python下一个被广泛应用的模板引擎。
模板:用真值替换变量,返回响应字符串,过程即渲染【render_template】
jinja2也有很多用法,详见Jinja2 模板用法 - 简书 (jianshu.com)
安装jinja
:pip install jinja2项目代码
:App.pyfrom flask import Flask,render_template import cv2 # 指定静态文件目录static,#static是固定写法,一定要用static app = Flask(__name__,static_url_path='/static',template_folder='templates') #检测人脸 def detect(filename): #注意检查路径是否正确 face_cascade = cv2.CascadeClassifier('C:/Users/zxy/Anaconda3/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml') img = cv2.imread(filename) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.3, 5) for (x, y, w, h) in faces: img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2) outname='static/img/2.jpg' cv2.imwrite(outname,img) return outname @app.route('/') def index(): outname=detect('static/img/1.jpg') return render_template('index.html',outname=outname) #return render_template('index.html') if __name__=='__main__': app.run(debug=True)
对应的模板templates下的index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>媒体大数据</title> </head> <body> <text>zxy+人脸识别</text><br> <!--<img src="{{url_for('static', filename='img/2.jpg')}}"/>--> <!--此处的filename只能写常量,且要注意前面已经指定了静态文件路径static_url_path是在static下面,不用再img前重复添加static了,"/"同样不需要--> <img src="{{outname}}" /> </body> </html>
运行结果
:
-
继续进阶——链接数据库mysql
调用数据库
:App.pyimport pymysql from flask import Flask,render_template @app.route('/english') //English的路由 def english(): db = pymysql.connect(host="localhost",user= "root", passwd="123", database="test", charset='utf8') //要加上前面的参数名称 cursor = db.cursor() //获得游标 try: sql="select * from map_enword limit 200"//SQL语句,显示前200个单词 cursor.execute(sql) rs = cursor.fetchall() rs = list(rs) //得到返回结果是一个list print(rs) except: rs = 'db-error' print('py-db-error') db.close() return render_template('english.html',rs=rs) if __name__=='__main__': app.run()
对应templates路径下的english.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>英语四六级词表</title> </head> <body> <h1>英语四六级词表</h1> <text>XXX</text>> <form action="/search"> //添加了按钮饰件 <input type="text" name="wanted" value="" default="apple"> <input type="submit" value="搜索"> </form> {% for r in rs %} {{r}}<br> {% endfor %} </body> </html>
结果显示:
将结果可视化
未完待续。。。