zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    模拟赛20181101 雅礼 Wearry 施工 蔬菜 联盟
    模拟赛20181031 雅礼 Wearry 养花 折射 画作
    set/priority_queue的运算符重载
    set的完整用法
    最长公共上升子序列 O(n^2)
    无向图边双联通分量 tarjan 模板
    ID 迭代加深搜索 模板 埃及分数
    树上背包DP Luogu P2014 选课
    A* 第k短路
    [POJ3468]关于整数的简单题 (你想要的)树状数组区间修改区间查询
  • 原文地址:https://www.cnblogs.com/shenjianping/p/13238550.html
Copyright © 2011-2022 走看看