flask中也有类似与django中的中间件,只不过是另一种写法,但是他们的作用是一样的,下面我们就一一介绍:
from flask import Flask, request, render_template, session, url_for, redirect, flash, get_flashed_messages
from markupsafe import Markup
app = Flask(__name__)
app.debug = True
app.secret_key = 'the_secret_key'
@app.before_request
def process_request(*args, **kwargs):
# 判断访问的是不是登入路径,是的话返回None继续往后走
if request.path == '/login':
return None
else:
# 不是的话判断是否携带用户信息(判断是否登入状态)
username = session.get('username')
print('username', username)
if username:
return None
else:
# 如果没有,则重定向到登入界面
return redirect('/login')
@app.route('/login')
def login():
username = request.args['username']
print(username)
if username == 'shawn':
session['username'] = username
return redirect('/index')
else:
return render_template('login.html')
@app.route('/index')
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run()
作用 : 类比django中间件中的process_response,如果请求没有出现异常的情况下, 会在请求返回return之前执行. 但是如果有多个顺序是从下往上执行.
与Django中process_response的区别
Django中当请求返回return后, 会从当前位置结束接着从当前位置response出去
Flask中的after_request请求返回return之后, 后面的response也会一个个走完
@app.after_request # 后执行
def process_response1(response):
print('process_response1')
return response
@app.after_request # 先执行
def process_response2(response):
print('process_response2')
return response
@app.teardown_request
def ter(e):
print("不管什么情况,都会触发,即便遇到了异常")
@app.teardown_request
def ter(e):
print("不管什么情况,都会触发,即便遇到了异常")
@app.errorhandler(404)
def error_404(arg):
return "404页面找不到了..."
@app.template_global()
def gl(a1, a2):
return a1 + a2
# html 文件中使用
{{ gl(1,2) }}
@app.template_filter()
def db(a1, a2, a3):
return a1 + a2 + a3
# html 文件中使用,相比较Django的过滤器最多只能传两个参数,这里可以传多个
# 1传给a1,2-->a2,3-->a3
{{ 1|db(2,3) }}
详细:Flask请求扩展及中间件 - 给你骨质唱疏松 - 博客园 (cnblogs.com)