Flask之请求扩展

Posted shenjianping

tags:

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

一、before_request

before_request相当于django中的process_request,每一个请求在被处理前都会经过这个方法,那么这个利用这个方法可以做什么呢?

  • 用户登录认证(这样避免了每一个视图函数都加用户登录认证的装饰器)
  • 用户权限校验
from flask import Flask, redirect, request, session, render_template

app = Flask(__name__)

app.secret_key = abcdef


@app.before_request
def process_request(*args, **kwargs):
    # 排除白名单,登录/login在进来时不需要进行验证
    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)  # 请求http://127.0.0.1:5000/login?username=zhangsan
def login():  # 该函数在before_request白名单中,需要单独判断
    username = request.args[username]
    print(username)
    if username == zhangsan:
        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()

  每一个请求进来之后首先就是经过before_request方法进行处理,但是/login是我们的登录地址,将其作为白名单处理,其余的每一个请求都会经过before_request函数进行处理(session判断)。

  before_request函数中如果返回值为None,那么就会继续向下走;如果不为None就会返回你的return值。另外还有一个before_first_request方法,顾名思义就是只对第一个请求做处理。

二、after_request

after_request相当于django中的process_response,每一个请求的返回值在被返回给页面前都会经过这个方法。

from flask import Flask
from flask.wrappers import Response

app = Flask(__name__)


@app.after_request
def process_response(response):
    return Response(hello)  #将所有的请求响应内容都进行了更改


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


if __name__ == __main__:
    app.run()

  所有的请求响应都会经过after_request方法,你可以在响应到页面前对所有视图函数的结果再进行一次处理。注意的是,该函数不能返回None值,如果不做任何处理,只需要返回response即可。

三、errorhandler

该装饰器函数就是对返回到页面错误信息的定制。

from flask import Flask


app = Flask(__name__)

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


@app.errorhandler(404)
def error_404(arg):     #当访问的页面出现404错误,就会返回该函数的返回值
    return 页面找不到了...

if __name__ == __main__:
    app.run()

errorhandler装饰器函数传入错误的code_or_exception,返回自定制的错误提示信息。

四、template_global、template_filter

template_global与template_filter分别是模板标签和模板过滤器。

from flask import Flask,render_template

#实例化Flask对象
app = Flask(__name__)

@app.template_global()
def double(n):
    return 2*n

@app.template_filter()
def add(x1,x2,x3):
    return x1+x2+x3


@app.route(/)
def index():
    return render_template(index.html)  #模板中可以直接使用标签和过滤器

if __name__ == __main__:
    app.run()

 模板index.html内容

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{{ double(2) }}<!--模板标签-->
{{ 1|add(2,3) }}<!--过滤器-->
</body>
</html>

 

以上是关于Flask之请求扩展的主要内容,如果未能解决你的问题,请参考以下文章

flask扩展系列之 - 访问速度限制

Flask之视图

Flask-RESTful扩展

Flask-RESTful扩展

flask基础之扩展

Flask之模板之宏继承包含