第九篇 Flask的before_request和after_request

Posted fengchong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第九篇 Flask的before_request和after_request相关的知识,希望对你有一定的参考价值。

Flask我们已经学习很多基础知识了,现在有一个问题

我们现在有一个 Flask 程序其中有3个路由和视图函数,如下:

技术分享图片
from flask import Flask

app = Flask(__name__)  # type:Flask


@app.route("/login")
def login():
    return "Login"

@app.route("/index")
def index():
    return "Index"

@app.route("/home")
def home():
    return "Login"

app.run("0.0.0.0", 5000)
简单的小程序

如果登陆了,就可以访问 index 和 home 页面,如果没登录就跳转到 login 登录

要怎么解决呢, session 对, 用 session 除了 Login 函数之外的所有函数里面全校验 session 是否登录了

太麻烦了,现在咱们只有3个函数,如果成百上千个怎么整啊

装饰器,对没错,装饰器是一个很好的方案,但是啊,我现在还是成败上千个函数,我要在每一个函数定义的时候加上@装饰器,还是很麻烦

那么就引出了我们@app.before_request

[email protected]_request 在请求(request)进入视图函数之前做出处理

技术分享图片
from flask import Flask
from flask import request
from flask import redirect
from flask import session

app = Flask(__name__)  # type:Flask
app.secret_key = "DragonFire"


@app.before_request
def is_login():
    if request.path == "/login":
        return None

    if not session.get("user"):
        return redirect("/login")


@app.route("/login")
def login():
    return "Login"


@app.route("/index")
def index():
    return "Index"


@app.route("/home")
def home():
    return "Login"


app.run("0.0.0.0", 5000)

解决所有问题
解决所有问题

@app.before_request 也是一个装饰器,他所装饰的函数,都会在请求进入视图函数之前执行

request.path 是来读取当前的url地址如果是 /login 就允许直接通过 return None 你可以理解成通过放行

校验session中是否有user 如果没有的话,证明没有登录,所以毫不留情的 redirect("/login") 跳转登录页面

2. @app.after_request 在响应(response)之前做出响应

@app.after_request
def foot_log(environ):
    if request.path != "/login":
        print("有客人访问了",request.path)
    return environ

3、执行顺序问题

@app.before_request
def A():
    pass

def B():
    pass

def C():
    pass

@app.after_request
def a():
    pass

def b():
    pass

def c():
    pass

如上所示执行顺序为:A->B->C->视图函数->c->b->a

如果B函数检验没有通过,则执行顺序为:A->B->c->b->a

以上是关于第九篇 Flask的before_request和after_request的主要内容,如果未能解决你的问题,请参考以下文章

Flask 第九篇flask-script组件

Flask初识,第九篇,Flask中的蓝图

Flask最强攻略 - 跟DragonFire学Flask - 第九篇 Flask 中的蓝图(BluePrint)

flask第九篇——url_for

flask第九篇——url_for

第九篇 道