Flask -- 特殊装饰器
之前有说过给Flask中的视图加装饰器,那么问题来了。我有100个视图。每个视图都需要加装饰器,那就要一个一个的加,这样很麻烦。
如果。有django中的中间件一样的功能就好了。
那么它来了。
它就是特殊的装饰器
before_request
这个装饰器的意思是在请求接收后。到达视图之前进行。
from flask import Flask, render_template, redirect, request, session
app = Flask(__name__, template_folder="templates", static_folder="static", static_url_path="/statics" ) app.secret_key = '123' app.config.from_object(Debugsetting) # app.config.from_object(Tessingsetting) @app.before_request # 使用装饰器 def be(): if request.path == '/login': # 判断请求路径。如果是登陆,放行 return None elif session.get('user'): # 如果get到session中的数据说明已经登陆 return None else: return redirect('login') 如果get不到session中的数据,说明没有登陆
@app.route('/login', methods=['GET', 'POST'], endpoint='login')
def login():
if request.method == 'GET':
return render_template('login.html')
user = request.form.get('username')
pwd = request.form.get('pwd')
if user == '123' and pwd == '123':
session['user'] = user
return render_template('index.html')
@app.route('/index',endpoint='index',)
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run()
after_request
视图函数结束 响应客户端之前执行该装饰器
@app.after_request def foot_log(response): if request.path != "/login": print("有客人访问了",request.path) return response
值得一提的是。在Flask中可以存在多个 before_request 和 after_request
before_request 的执行顺序是代码编写顺序执行
after_request 的执行顺序是按代码编写顺序倒序执行
另外在 after_request 中必须写一个形参来接收 返回值 ,并且把接收的返回值 返回
注意 : before_request 和 after_request 执行时。先执行全局的(主启动文件中的)在执行局部的(蓝图文件中的)
errorhandler
这个装饰器在出现404 / 500 这样的错误,用来返回一个页面或重定向
@app.errorhandler(404)
def error(msg):
print(msg)
return redirect('http://www.baidu.com')
需要注意的是 errorhandler 后写的参数必须是 int 类型
所装饰的函数必须有一个形参来接受 errorMessage
最后,说一下特殊装饰器的请求生命周期