zoukankan      html  css  js  c++  java
  • Flask--请求扩展

    请求扩展

    before_request

    类似于django中的process_request,在收到请求之后,进入视图函数之前,进行一些数据或者怎样的处理

    • 可写多个before_request函数
    • 从上往下执行的
    • 一旦有返回值,请求的视图函数不会执行,已经剩下的before_request不会执行
    from flask import Flask,render_template,request,redirect,session,url_for
    
    app = Flask(__name__)
    app.debug = True
    app.secret_key = "123#234"
    
    USERS = {
        1:{"name":"老大", "age":19,"gender":"男", "resume":"言语措辞间都能体会到今日头条的谨小慎微,生怕再出现任何问题……."},
        2:{"name":"老二", "age":18,"gender":"女", "resume":"当打开这款APP之后,就会发现这跟已经“死”去的内涵段子简直是一模一样。更厉害的地方是,它还支持用用户迁移内涵段子上的内容信息。"},
        3:{"name":"老三", "age":17,"gender":"男", "resume":"如果狒狒会说人话,他肯定是在说:喂…你怎么只给我吃了一口就跑了呀,我还没吃饱啊…喂喂喂…给我回来呀!哈哈哈"},
    }
    
    # 基于flask里请求扩展来做
    @app.before_request
    def process_request(*args, **kwargs):
        # 验证表示,任何地址请求都会先执行before_request,所以登录验证就可以在before_request里做用户认证功能了
        print("其他请求之前就执行了process_request")
        # 4.访问/login的时候还没有登录,就会一直重定向到登录页,所以就要设置个白名单,如果请求地址是/login,就返回None
        if request.path == "/login":
            return None
        # 1.登录验证功能
        user = session.get('user_info')
        # 2.如果登录信息正常,什么都不做,程序继续其他执行
        if user:
            return None
        # 3.如果登录验证不通过,就重定向到登录页面
        return redirect("/login")
    
    
    @app.route("/detail/<int:nid>", methods=['GET'])
    def detail(nid):
        detail_info = USERS.get(nid)
        # 如果有值,就跳到详情页
        return render_template("detail.html",info = detail_info)
    
    
    @app.route("/index", methods=['GET'])
    def index():
        return render_template("index.html", user_dict=USERS)
    
    
    @app.route("/login", methods=['GET', 'POST'], endpoint='l1')
    def login():
        if request.method =="GET":
            return render_template("login.html")
        else:
            user = request.form.get("username")
            pwd = request.form.get("password")
            if user == "alex" and pwd =="123456":
                session['user_info'] = user
                return redirect("/index")
            return render_template("login.html", **{"error":"用户名和密码错误"})
    
    if __name__ == "__main__":
        app.run()
    

    after_request

    类比django中间件中的process_response,每一个请求之后绑定一个函数,如果请求没有异常

    • 可以写多个after_request函数
    • 所有的after_request是从下往上执行,和before_request相反
    • 无论 before_request有没有返回值,我的after_request都会执行
    • 必须接受response,而且必须返回response
    from flask import Flask,render_template,request,redirect,session,url_for
    app = Flask(__name__)
    app.debug = True
    app.secret_key = 'siuljskdjfs'
    
    @app.before_request
    def process_request1(*args,**kwargs):
        print('process_request1 进来了')
    
    @app.after_request
    def process_response1(response):
        print('process_response1 走了')
        # after_request 必须返回 response
        return response
    
    # 视图函数
    @app.route('/index',methods=['GET'])
    def index():
        print('index函数')
        return "Index"
    
    if __name__ == '__main__':
        app.run()
    

    before_first_request

    项目启动后,接受到的第一个请求,会执行该函数,后面就不会在执行

    ​ 比如:数据库的连接,初始化操作

    from flask import Flask,request
    app = Flask(__name__)
    app.debug = True
    
    # 内部其实就有个判断,初始值是FALSE,第一次执行后将值改变为True,以后判断后就不执行了
    @app.before_first_request
    def before_first_request2():
        print('before_first_request2')
    
    if __name__ == '__main__':
        app.run()
    

    teardown_request

    每一个请求之后绑定一个函数,即使遇到了异常 ,也不会终止函数的执行

    • 这是e 是接收我服务器抛出的异常
    • 无论我服务器有没有错误,都会执行该函数
    • 虽然能接收异常,但是没有办法处理异常
    • 可以用来监控程序是否报错,记录日志
    #如论有无异常都执行,如果没有异常这个e就是None
    @app.teardown_request
    def ter(e):
        # if e:
            #logingh
        # return "wo si l"
        print("我抛异常")
    

    errorhandler

    定制错误信息:

    • 参数的中值为错误码
    • 当服务器抛出对应状态码的异常,就会执行该函数
    • 并且该函数可以处理异常,让用户无法感知,服务器错误
    • 每一个错误码,都需要一个对应的函数进行处理
    from flask import Flask,render_template,request,redirect,session,url_for
    app = Flask(__name__)
    app.debug = True
    app.secret_key = 'siuljskdjfs'
    
    # 经常会出现url不存在的情况,一般会有错误信息
    # 而这个错误信息也是可以进行定制的,根据错误码定制错误信息方法如下:
    @app.errorhandler(404)
    def error_404(arg):
        return "404错误了"
    
    # 视图函数
    @app.route('/index',methods=['GET'])
    def index():
        print('index函数')
        return "Index"
    
    if __name__ == '__main__':
        app.run()
    

    template_global

    模板中定制方法/定制模板方法:

    from flask import Flask,request
    app = Flask(__name__)
    app.debug = True
    
    # 这就是基于请求扩展的 定制模板方法
    # 相对于在模板里定制了一个函数
    
    @app.template_global()
    def sb(a1, a2):
        return a1 + a2
    
    # 在HTML里调用的方式:{{sb(1,2)}}
    
    if __name__ == '__main__':
        app.run()
    

    template_filter

    过滤器

    from flask import Flask,request
    app = Flask(__name__)
    app.debug = True
    
    # 这就是基于请求扩展的 定制模板方法
    @app.template_filter()
    def db(a1, a2, a3):
        return a1 + a2 + a3
    
    #在HTML里调用的方式如下:
    # {{ 1|db(2,3)}   # 参数 a1 = 1,是第一个参数; a2=2 是第二个参数;   a3=3 是第三个参数
    
    if __name__ == '__main__':
        app.run()
    
  • 相关阅读:
    基于RSA的WEB前端密码加密方案
    私钥加密公钥解密或者公钥加密私钥解密有意义吗?
    MySQL索引背后的数据结构及算法原理
    深入理解MySQL索引原理和实现——为什么索引可以加速查询?
    shim和polyfill有什么区别
    [转]使用HttpOnly提升Cookie安全性
    RLE压缩算法详解
    [转]详解布隆过滤器的原理,使用场景和注意事项
    小白科普:Netty有什么用?
    RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密?
  • 原文地址:https://www.cnblogs.com/Hades123/p/11781182.html
Copyright © 2011-2022 走看看