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>
  • 相关阅读:
    python json 和 pickle的补充 hashlib configparser logging
    go 流程语句 if goto for swich
    go array slice map make new操作
    go 基础
    块级元素 行内元素 空元素
    咽炎就医用药(慢性肥厚性咽炎)
    春季感冒是风寒还是风热(转的文章)
    秋季感冒 咳嗽 怎么选药
    解决IE浏览器“无法显示此网页”的问题
    常用的 css 样式 记录
  • 原文地址:https://www.cnblogs.com/shenjianping/p/13238550.html
Copyright © 2011-2022 走看看