1、异常处理
flask对
HTTP错误
进行了封装, 可以捕获
http错误, 也可以主动抛出
http错误
扩展:
# 权限认证失败
# abort(401)
# 禁止访问
# abort(403)
# 请求方法错误
# abort(405)
# 服务器内部错误
# abort(500)
from flask import Flask, redirect, abort
# 需求:捕获项目中的所有404异常信息,引导到一个统一的页面
# 需求:主动产生异常
app = Flask(__name__)
@app.route('/')
def hello_world():
# a = 1/0
# 主动抛出异常
# 参数:必须是http标准的错误状态码
abort(404)
return 'Hello World!'
# code_or_exception参数:捕获错误状态码,异常类
@app.errorhandler(404)
def error_404_handler(e):
print(e)
# 统一引导到指定页面,提高用户体验
return redirect("http://err.www.mi.com/04.html")
@app.errorhandler(ZeroDivisionError)
def error_handler(e):
return "不能除0"
if __name__ == '__main__':
app.run(debug=True, port=8000)
2、请求勾子
before_request
:
每次执行视图函数之前调用
对请求进行一些准备处理
如果在该函数中返回了一个响应,视图函数将不再被调用
after_request
:
如果没有抛出错误,每次执行视图函数之后(已经包装为响应对象)调用
在此函数中可以对响应值在返回之前做最后一步修改处理
接受一个参数:包装好的响应对象
需要将修改后的响应对象返回
before_first_request
:
web应用被第一次请求前调用
可以进行web应用初始化处理
teardown_request
:
每次执行视图函数之后调用
无论是否出现异常都会执行, 一般用于请求收尾
接受一个参数:错误信息,如果有相关错误抛出
示例:
@app.before_first_request
def inital():
"""
第一次请求之前调用[仅会调用一次]
作用:项目初始化操作
:return: 不需要返回
"""
print("before_first_request 调用了")
2、蓝图(相当于Django的中间件)
1、蓝图的作用: 实现Flask项目 模块化,作用和app对象类似,只不过app对象管理的是整个工程,蓝图管理的是单个模块。
2、项目模块化主要是 将业务以功能模块进行划分, 每个功能模块对应一个包, 用于存放和其有关的视图/工具/模型文件等, 如home, user
3、对于大型项目, 一般 每个功能模块对应创建一个蓝图, 由多个蓝图代替应用来分别管理各模块的视图
3、上下文(context)
上下文:是一个 数据容器,保存了 Flask 程序运行过程中的一些信息。
Flask中有两种上下文,请求上下文 和 应用上下文
两种上下文的使用范围相同, 从请求开始到请求结束, 在范围外使用会报错
- 请求上下文
记录一些和请求有关的数据, 包括request和session两个变量
request
封装了HTTP请求的内容,针对的是http请求。
session
用来记录请求会话中的信息,针对的是用户信息。
- 应用上下文
记录一些和应用有关的数据, 包括current_app
和g
两个变量
current_app
会自动引用创建的Flask对象, 需要在项目的其他文件中使用app时, 应该通过current_app来获取, 可以减少循环导入问题
g
flask给开发者预留的一个容器, 用于记录自定义数据
生命周期:[请求开始 返回响应]
作用范围:默认情况在视图函数内部才能使用
特点:每一次请求结束之后会清空
# 导包
from flask import Flask, request, session, current_app, g
# 在视图函数外面,获取当前工程的app对象
with app.app_context():
print(current_app)
g变量的使用,一般在钩子函数
和视图函数
之间进行参数传递
g.username = "Tom" # 赋予g变量值
print(g.username) # 获取g变量值