Flask快速入门与进阶
欢迎来到Flask的世界
1. Flask介绍
Flask诞生于2010年,是Armin ronacher 用 Python 语言基于 Werkzeug 工具箱编写的轻量级Web开发框架。
Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能。Flask没有默认使用的数据库、窗体验证工具。
Flask 本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login,数据库Flask-SQLAlchemy),都需要用第三方的扩展来实现。比如可以用 Flask 扩展加入ORM、窗体验证工具,文件上传、身份验证等。Flask 没有默认使用的数据库,可以选择 MySQL,也可以用 NoSQL。
其 WSGI 工具箱采用 Werkzeug(路由模块),模板引擎则使用 Jinja2。这两个也是 Flask 框架的核心。
1.1 Flask文档
中文文档
https://dormousehole.readthedocs.io/en/latest/
英文文档
https://flask.palletsprojects.com/en/2.1.x/
1.2 常用扩展包
扩展列表:http://flask.pocoo.org/extensions/
例如:
Flask-SQLalchemy:操作数据库;
Flask-script:插入脚本;
Flask-migrate:管理迁移数据库;
Flask-Session:Session存储方式指定;
Flask-WTF:表单;
Flask-Mail:邮件;
Flask-Bable:提供国际化和本地化支持,翻译;
Flask-Login:认证用户状态;
Flask-OpenID:认证;
Flask-RESTful:开发REST API的工具;
Flask-Bootstrap:集成前端Twitter Bootstrap框架;
Flask-Moment:本地化日期和时间;
Flask-Admin:简单而可扩展的管理接口的框架
1.3 框架对比
框架轻重
-
重量级的框架:为方便业务程序的开发,提供了丰富的工具、组件,如Django
-
轻量级的框架:只提供Web框架的核心功能,自由、灵活、高度定制,如Flask、Tornado
与Django对比
django提供了:
django-admin快速创建项目工程目录
manage.py 管理项目工程
orm模型(数据库抽象层)
admin后台管理站点
缓存机制
文件存储系统
用户认证系统
而这些,flask都没有,都需要扩展包来提供
1.4 flask特点
目前,我国市场上大部分智能交通系统控制平台采用的都是C/S模式,对终端要求较高,且安装繁琐。部分的平台也有采用基于B/S模式传统框架,但这些框架的一些功能大多被固定,缺乏灵活性。采用Flask微型框架做服务器的后台开发,Flask是基于Python开发的框架,类似的框架还有Django、Tornado等,之所选择Flask来开发,原因如下:
一、后续的基于机器学习的车辆检测与属性识别算法研究,主要开发语言也是应用Python,整个系统统一开发语言,便于开发和后期维护。
二、Flask因为灵活、轻便且高效的特点被业界认可,同时拥有基于Werkzeug、Jinja2等一些开源库,拥有内置服务器和单元测试,适配RESTful,支持安全的cookies,而且官方文档完整,便于学习掌握。
三、Flask中拥有灵活的Jinja2模板引擎,提高了前端代码的复用率。这样可以提高开发效率和有利于后期开发与维护。在现有标准中,Flask算是微小型框架。Flask有两个主要依赖:路由、调试和Web服务器网关接口
(WebServerGatewayInterface,WSGI)子系统由Werkzeug提供;模板系统由Jinja2提供。Werkzeug和Jinja2都是由Flask的核心开发者开发而成。对于数据库访问、验证Web表单和用户身份认证等一系列功能,Flask框架是不支持的。这些功能都是以扩展组件的方式进行实现,然后再与Flask框架集成。开发者可以根据项目的需求进行相应的扩展,或者自行开发。这与大型框架恰恰相反,大型框架本身做出了大部分决定,难以灵活改变方案。
Flask的特点有:良好的文档、丰富的插件、包含开发服务器和调试器(debugger)、集成支持单元测试、RESTful请求调度、支持安全cookies、基于Unicode.
2. 项目创建
2.1 安装环境
pip install flask
2.2 完成第一个项目
2.2.1 创建项目
2.2.2 打开项目
2.2.3 代码解释说明
# 导入Flask类
from flask import Flask
#Flask类接收一个参数__name__
app = Flask(__name__)
# 装饰器的作用是将路由映射到视图函数index
@app.route('/')
def index():
return 'Hello World'
# Flask应用程序实例的run方法启动WEB服务器
if __name__ == '__main__':
app.run()
2.2.4 启动项目
手动运行
python app.py
pycharm 运行
像正常运行普通python程序一样即可。
2.3 参数说明
flask对象初始化参数
Flask 程序实例在创建的时候,需要默认传入当前 Flask 程序所指定的包(模块)
import_name
Flask程序所在的包(模块),传 name 就可以
其可以决定 Flask 在访问静态文件时查找的路径
static_url_path
静态文件访问路径,可以不传,默认为:/ + static_folder
static_folder
静态文件存储的文件夹,可以不传,默认为 static
template_folder
模板文件存储的文件夹,可以不传,默认为 templates
默认参数情况下
app = Flask(__name__)
访问 127.0.0.1:5000/static/2.jpeg 就可以访问到图片
2.4 应用程序配置参数
Django将所有配置信息都放到了settings.py文件中,而Flask则不同。
Flask将配置信息保存到了app.config属性中,该属性可以按照字典类型进行操作
读取
app.config.get(name)
app.config[name]
设置
主要使用以下三种方式:
1.从配置对象中加载
2.从配置文件中加载
3.从环境变量中加载
项目中的常用方式
app.run 参数
可以指定运行的主机IP地址,端口,是否开启调试模式
app.run(host="0.0.0.0", port=5000, debug = True)
关于DEBUG调试模式
1.程序代码修改后可以自动重启服务器
2.在服务器出现相关错误的时候可以直接将错误信息返回到前端进行展示
2.5 开发服务器运行方式
在1.0版本之后,Flask调整了开发服务器的启动方式,由代码编写app.run()语句调整为命令flask run启动。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello World'
# 程序中不用再写app.run()
2.5.1 终端启动
$ export FLASK_APP=helloworld
$ flask run
* Running on http://127.0.0.1:5000/
环境变量 FLASK_APP 指明flask的启动实例
flask run -h 0.0.0.0 -p 8000 绑定地址 端口
flask run --help获取帮助
生产模式与开发模式的控制
通过FLASK_ENV环境变量指明
export FLASK_ENV=production 运行在生产模式,未指明则默认为此方式
export FLASK_ENV=development运行在开发模式
说明
$ export FLASK_APP=helloworld
$ python -m flask run
* Running on http://127.0.0.1:5000/
2.5.2 Pycharm启动
设置环境变量
3. 路由与蓝图
路由
from flask import Flask, render_template, redirect
app = Flask("DragonFire")
@app.route("/index")
def index():
return "Hello World!"
@app.route("/home")
def home():
return render_template("home.html")
@app.route("/r")
def goto_index():
return redirect("/index") # 302 /index
if __name__ == '__main__':
app.run()
浏览器 展示
在终端中:flask routes,会输出如下信息:
Endpoint Methods Rule
-------- ------- -----------------------
index GET /
static GET /static/<path:filename>
endpoint:端点,视图函数名的字符串形式;
methods:请求方法;
rule:路径规则;
static是Flask框架帮我们默认创建的静态路由,方便静态文件的访问;
查看路由的方式:app.url_map,存储项目中所有的路由映射;
Map(
[
<Rule '/abc' (HEAD, OPTIONS, GET) -> index2019>,
<Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>
]
)
python中<>存储的信息,一般表示对象;
map:表示路由映射,容器列表;
rule:路径规则,存储了url的路径名、http请求方法、端点(视图函数名)
蓝图
-
Flask自带的模块,容器,存储了一组将来在应用程序上执行的操作;不能独立运行,可以有自己的静态文件和模板等;
- 类似于Django中的子应用;
-
蓝图的多文件使用:容易发生循环导入的问题。
- 除了基本的三步以外,必须把使用蓝图对象的视图文件,导入到创建蓝图对象的文件中;