状态保持,异常处理,钩子函数
状态保持
-
session 和 cookie
- 存放位置 cookie 存在客户端 session 服务端
- 保存大小 cookie 大小限制在 4096 字节 session 取决硬件
- 安全性 cookie 相对来说不安全 session 相对来说是安全的
-
Cookie实现方式
# 设置 cookie resp = make_response('自定义的响应字符串') resp.set_cookie("键","值",max_age=60) # 获取cookie request.cookies.get("键")
-
Session实现方式
# 导包 from flask import session # 设置session session['键'] = '值' # 获取session session.get("键") or session["键"]
钩子函数 hooks
钩子函数是指在执行函数和目标函数之间挂载的函数,框架开发者给调用方提供一个point-挂载点,至于挂载什么函数由调用方决定,大大提供了灵活性。
-
@app.before_first_request
在对应用程序实例的第一个请求之前注册要运行的函数,只会运行一次
@app.before_first_request def before_first_request_view(): print("只执行一次")
-
@app.before_request
在每个请求之前注册一个要运行的函数,每一次请求都会执行一次。
@app.before_request def before_request_view(): print("每次请求都执行")
-
@app.teardown_request
注册在每一个请求的末尾,不管是否有异常,每次请求的最后都会执行。
场景: 关闭数据库的连接 打开文件open 最终关闭
@app.teardown_request def teardown_request_view(e): print("不管有没有错误 都会执行")
-
@app.errorhandler(400)
发生一些异常时,比如404,500,或者抛出异常(Exception)之类的,就会自动调用该钩子函数
1.发生请求错误时,框架会自动调用相应的钩子函数,并向钩子函数中传入error参数
2.如果钩子函数没有定义error参数,就会报错
3.可以使用abort函数来手动终止请求抛出异常,如果要是发生参数错误,可以abort(404)之类的@app.errorhandler(500) def handle_errorhandler(e): print(e) return {"code":1002,"msg":"服务器内部错误","data":{}}, 500
异常处理
-
abort
主动抛出异常abort(状态码)
-
异常处理函数
@app.errorhandler(500) def handle_errorhandler(e): print(e) return {"code":1002,"msg":"服务器内部错误","data":{}}, 500
flask 上下文
-
定义
上下文:即语境,语意,在程序中可以理解为在代码执行到某个时刻,根据之前代码锁做的操作以及下文即将要执行的逻辑,可以决定在当前时刻下可以使用到的变量,或者可以做的事情。
-
flask 中的上下文
请求上下文(request context)
和
应用上下文(application context)。 -
上下文图解
-
Flask上下文对象分类
- 请求上下文
- request
- session
- cookie
- 应用上下文:
- current_app
- g对象
-
上下文怎么使用
# 手动开启上下文 在flask程序未运行的情况下, 调试代码或进行测试, 同样需要使用current_app, g, request这些对象, 但程序未运行, 所以无法使用, 此时需要手动开启上下文. # app_context app_context为我们提供了应用上下文环境, 允许我们在外部使用应用上下文current_app, g. 可以通过with语句进行使用: >>> from flask import Flask >>> app = Flask('') >>> app.redis_cli = 'redis client' >>> from flask import current_app >>> current_app.redis_cli # 错误,没有上下文环境 报错 >>> with app.app_context(): # 借助with语句使用app_context创建应用上下文 ... print(current_app.redis_cli) ... redis client
request_context
request_context为我们提供了请求上下文环境,允许我们在外部使用请求上下文request、session可以通过with语句进行使用。
from flask import Flask
app = Flask('')
request.args # 错误,没有上下文环境
报错
environ = {'wsgi.version':(1,0), 'wsgi.input': '', 'REQUEST_METHOD': 'GET', 'PATH_INFO': '/', 'SERVER_NAME': 'itcast server', 'wsgi.url_scheme': 'http', 'SERVER_PORT': '80'} # 模拟解析客户端请求之后的wsgi字典数据
with app.request_context(environ): # 借助with语句使用request_context创建请求上下文
... print(request.path)