全局拦截器
from flask import Flask, request, url_for
app = Flask(__name__)
@app.route("/index")
def index():
return "index page"
@app.before_first_request
def handle_before_first_request():
"""在第一次请求处理之前先被执行"""
print("handle_before_first_request 被执行")
@app.before_request
def handle_before_request():
"""在每次请求之前都被执行"""
print("handle_before_request 被执行")
@app.after_request
def handle_after_request(response):
"""在每次请求(视图函数处理)之后都被执行, 前提是视图函数没有出现异常"""
print("handle_after_request 被执行")
return response
@app.teardown_request
def handle_teardown_request(response):
"""在每次请求 (视图函数处理)之后都被执行, 无论视图函数是否出现异常,都被执行, 工作在非调试模式时 debug=False"""
path = request.path
if path == url_for("index"):
print("在请求钩子中判断请求的视图逻辑: index")
elif path == url_for("hello"):
print("在请求钩子中判断请求的视图逻辑: hello")
print("handle_teardown_request 被执行")
return response
if __name__ == '__main__':
app.run()
模块拦截器(单个蓝图模块文件)
comment = Blueprint('comment', __name__)
@comment.before_request
def before_comment():
if session.get('islogin') is None or session.get('islogin') != 'true':
return 'not-login'
资源选择性放行(通过匹配url后缀方式)
@app.before_request
def before():
url = request.path
pass_list = ['/user', '/login', '/logout']
if url in pass_list or url.endswith('.js') or url.endswith('.jpg'):
pass
elif session.get('islogin') is None:
username = request.cookies.get('username')
password = request.cookies.get('password')
if username != None and password != None:
user = Users()
result = user.find_by_username(username)
if len(result) == 1 and result[0].password == password:
session['islogin'] = 'true'
session['userid'] = result[0].userid
session['username'] = username
session['nickname'] = result[0].nickname
session['role'] = result[0].role