本文的主要内容:flask视图&路由、虚拟环境安装、路由各种定义、状态保持、cookie、session、模板基本使用、过滤器&自定义过滤器、模板代码复用:宏、继承/包含、模板中特有变量和函数、Flask-WTF 表单、CSRF、数据库操作、ORM、Flask-SQLAlchemy、增删改查操作、案例、蓝图、单元测试
Flask整套笔记直接地址: 请移步这里
共 4 章,42 子模块,总计 29211 字
视图及路由
- Flask简介
- 虚拟环境
- 路由的各种定义方式
- 正则路由转换器
- 请求参数
- 状态保持
- 上下文
- Flask-Script
学习目标
- 能够根据课件步骤安装虚拟环境
- 能够创建 Py3 版本的虚拟环境
- 能够使用 pip 命令安装指定版本 Flask 及其他扩展
- 能够写出 Flask 从对象中加载配置的代码
- 能够说出url_for的作用
- 能够写出带有参数的路由及视图函数
- 能够说出自定义转换器的步骤
- 能够说出装饰器路由实现的几个关键的类
- 能够说出实现 HTTP 状态保持的原理
- 能够说出 Flask 各个上下文对象
- 能够说出 Flask-Script 扩展的作用
相关配置参数
在上一节实现了一个最简单的 Flask 应用程序,只使用了7行代码,接来对 Flask 程序的创建,运行配置做进一步的了解,具体有:
- Flask 程序初始化参数
- Flask 程序相关配置加载方式
- app.run() 参数
初始化参数
Flask 程序实例在创建的时候,需要默认传入当前 Flask 程序所指定的包(模块),接下来就来详细查看一下 Flask 应用程序在创建的时候一些需要我们关注的参数:
- import_name
- Flask程序所在的包(模块),传
__name__
就可以 - 其可以决定 Flask 在访问静态文件时查找的路径
- Flask程序所在的包(模块),传
- static_path
- 静态文件访问路径(不推荐使用,使用 static_url_path 代替)
- static_url_path
- 静态文件访问路径,可以不传,默认为:
/ + static_folder
- 静态文件访问路径,可以不传,默认为:
- static_folder
- 静态文件存储的文件夹,可以不传,默认为
static
- 静态文件存储的文件夹,可以不传,默认为
- template_folder
- 模板文件存储的文件夹,可以不传,默认为
templates
- 模板文件存储的文件夹,可以不传,默认为
程序加载配置
在 Flask 程序运行的时候,可以给 Flask 设置相关配置,比如:配置 Debug 模式,配置数据库连接地址等等,设置 Flask 配置有以下三种方式:
- 从配置对象中加载(常用)
- app.config.from_object()
- 从配置文件中加载
- app.config.from_pyfile()
- 从环境变量中加载(了解)
- app.config.from_envvar()
以下演练以设置应用程序的 DEBUG(调试模式) 为例,设置应用为调式模式这后,可以实现以下功能:
1. 程序代码修改后可以自动重启服务器 2. 在服务器出现相关错误的时候可以直接将错误信息进行抛出到控制台打印
使用方式
配置对象
-
从配置对象中加载,创建配置的类,代码如下:
配置对象,里面定义需要给 APP 添加的一系列配置
class Config(object): DEBUG = True
# 创建 Flask 类的对象,指向程序所在的包的名称
app = Flask(__name__)
# 从配置对象中加载配置
app.config.from_object(Config)
运行测试,在修改代码之后直接保存,会自动重启服务器
配置文件
- 创建配置文件
config.ini
,在配置文件中添加配置
-
使用代码去加载配置
创建 Flask 类的对象,指向程序所在的包的名称
app = Flask(name)
从配置文件中加载配置
app.config.from_pyfile('config.ini')
环境变量(了解)
- 编辑运行的相关配置
-
使用代码去加载配置
创建 Flask 类的对象,指向程序所在的包的名称
app = Flask(name)
加载指定环境变量名称所对应的相关配置
app.config.from_envvar('FLASKCONFIG')
读取配置
- app.config.get()
- 在视图函数中使用 current_app.config.get()
注:Flask 应用程序将一些常用的配置设置成了应用程序对象的属性,也可以通过属性直接设置/某些配置:app.debug = True
app.run的参数
-
可以指定运行的主机IP地址,端口,是否开启调试模式
app.run(host="0.0.0.0", port=5000, debug = True)
[__](../shi-tu-ji-lu-you/lu-you-de- ge-zhong-ding-yi.html)
路由基本定义
- 明确路由定义的参数,请求方式指定
- PostMan 的使用
指定路由地址
# 指定访问路径为 demo1
@app.route('/demo1')
def demo1():
return 'demo1'
给路由传参示例
有时我们需要将同一类 URL 映射到同一个视图函数处理,比如:使用同一个视图函数来显示不同用户的个人信息。
# 路由传递参数
@app.route('/user/<user_id>')
def user_info(user_id):
return 'hello %s' % user_id
-
路由传递的参数默认当做 string 处理,也可以指定参数的类型
路由传递参数
@app.route('/user/int:user_id') def user_info(user_id): return 'hello %d' % user_id
这里指定int,尖括号中的内容是动态的,在此暂时可以理解为接受 int 类型的值,实际上 int 代表使用 IntegerConverter 去处理 url 传入的参数
指定请求方式
在 Flask 中,定义一个路由,默认的请求方式为:
- GET
- OPTIONS(自带)
- HEAD(自带)
如果想添加请求方试,那么可以如下指定:
@app.route('/demo2', methods=['GET', 'POST'])
def demo2():
# 直接从请求中取到请求方式并返回
return request.method
demo2 请求方式为:
使用 PostMan 对请求进行测试
PostMan 是一款功能强大的网页调试与发送网页 HTTP 请求的 Chrome 插件,可以直接去对我们写出来的路由和视图函数进行调试,作为后端程序员是必须要知道的一个工具。
-
安装方式1:去 Chrome 商店直接搜索 PostMan 扩展程序进行安装
-
安装方式2:官网下载桌面版
-
安装方式3:将已下载好的 PostMan 插件文件夹拖入到浏览器
- 打开 Chrome 的扩展程序页面,打开
开发者模式
选项 - 将插件文件夹拖入到浏览器(或者点击加载已解压的扩展程序选择文件夹)
- 在 Mac 下生成桌面图标,可以点击启动
- 在 ubuntu 旧版的 Chrome 浏览器中会显示以下效果,可以直接点击启动
- 打开 Chrome 的扩展程序页面,打开
-
使用 PostMan,打开之后,会弹出注册页面,选择下方的
Skip this,go straight to the app
进行程序
[__](../shi-tu-ji-lu- you/shi-tu-chang-yong-luo-ji.html)
视图常用逻辑
- 返回 JSON
- 重定向
- url_for
- 自定义状态码
返回JSON
在使用 Flask 写一个接口时候需要给客户端返回 JSON 数据,在 Flask 中可以直接使用 jsonify 生成一个 JSON 的响应
# 返回JSON
@app.route('/demo4')
def demo4():
json_dict = {
"user_id": 10,
"user_name": "laowang"
}
return jsonify(json_dict)
不推荐使用 json.dumps 转成 JSON 字符串直接返回,因为返回的数据要符合 HTTP 协议规范,如果是 JSON 需要指定 content- type:application/json
重定向
-
重定向到百度
重定向
@app.route('/demo5') def demo5(): return redirect('baidu')
-
重定向到自己写的视图函数
- 可以直接填写自己 url 路径
- 也可以使用 url_for 生成指定视图函数所对应的 url
@app.route('/demo1') def demo1(): return 'demo1'
重定向
@app.route('/demo5') def demo5(): return redirect(url_for('demo1'))
-
重定向到带有参数的视图函数
- 在 url_for 函数中传入参数
路由传递参数
@app.route('/user/int:user_id') def user_info(user_id): return 'hello %d' % user_id
重定向
@app.route('/demo5') def demo5():
# 使用 url_for 生成指定视图函数所对应的 url return redirect(url_for('user_info', user_id=100))
自定义状态码
-
在 Flask 中,可以很方便的返回自定义状态码,以实现不符合 http 协议的状态码,例如:status code: 666
@app.route('/demo6') def demo6(): return '状态码为 666', 666