Fork me on GitHub

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>

 

posted @ 2020-07-05 22:02  iveBoy  阅读(293)  评论(0编辑  收藏  举报
TOP