before_request和after_request
from flask import Flask
app = Flask(__name__)
# 请求中间件
@app.before_request
def xxxx():
print('执行之前')
# 响应中间件
@app.after_request
def xxxxx(response):
print('执行之后')
return response
@app.route('/x1')
def x1():
print('x1')
return 'x1'
@app.route('/x2')
def x2():
return 'x2'
if __name__ == '__main__':
app.run(debug=True, port=80)
多个请求中间件,按照先后顺序执行
多个请求中间件,执行顺序与请求中间件相反

常见装饰器
# 只执行一次的请求中间件
@app.before_first_request
def before_f():
print('来了')
# 自定义404页面
@app.errorhandler(404)
def not_found(error):
return "This page does not exist"
# 全局传值
def fun():
return dict(xxx='123')
app.context_processor(fun)
闪现
from flask import Flask, flash, get_flashed_messages
app = Flask(__name__)
app.secret_key = 'xxx-xxx-xxx-xxx'
app.config.from_object('flask_study.settings.DevelopmentConfig') # 导入类或者路径
@app.route('/x1')
def x1():
flash('你好') # 设置消息
return '设置消息'
@app.route('/x2')
def x2():
print(get_flashed_messages()) # 接收消息,接收了之后,后面就没有了
return '接收消息'
if __name__ == '__main__':
app.run()
也可以给消息设定一个分类
from flask import Flask, flash, get_flashed_messages
app = Flask(__name__)
app.secret_key = 'xxx-xxx-xxx-xxx'
app.config.from_object('flask_study.settings.DevelopmentConfig') # 导入类或者路径
@app.route('/x1')
def x1():
flash('你好', category='x1')
flash('你好1', category='x2')
return '设置消息'
@app.route('/x2')
def x2():
print(get_flashed_messages())
print(get_flashed_messages(category_filter='x1')) # 接收特定消息
return '接收消息'
if __name__ == '__main__':
app.run()
flask中间件
from flask import Flask
app = Flask(__name__)
app.secret_key = 'xxx-xxx-xxx-xxx'
app.config.from_object('flask_study.settings.DevelopmentConfig') # 导入类或者路径
@app.route('/x1')
def x1():
print('视图函数')
return '设置消息'
class MiddleWare:
def __init__(self, old_wsgi_app):
self.old_wsgi_app = old_wsgi_app
def __call__(self, *args, **kwargs):
# 在这里用不了request,session
# 所以中间件应用不多
print('请求之前')
obj = self.old_wsgi_app(*args, **kwargs)
print('请求之后')
return obj
if __name__ == '__main__':
# 请求到了之前,会执行 app的__call__方法
app.wsgi_app = MiddleWare(app.wsgi_app)
app.run()