• 第七章 Flask——特殊装饰器


    第七章 Flask——特殊装饰器

    一、@app.template_filter()

    二、@app.template_global()

    三、@app.errorhandler

    四、@app.errorhandler

    五、@app.after_request

    一、@app.template_filter()

    自定义过滤器

    flask_app.py

    # 使用装饰器事项过滤器,
    # 如果不传入参数,默认过滤器名字就是函数的名字    
    @app.template_filter()
    def my_filter(args):
        temp = list(args)
        temp.reverse()
        return temp

    html

    {{ [1,2,3,4,5,6] | my_filter }}

    二、@app.template_global()

    全局模板函数

    flask_app.py

    @app.template_global()  # 定义全局模板函数
    def a_b_sum(a, b):
        return a + b

    html

    {{ a_b_sum(99,1) }}

    三、@app.errorhandler

    控制响应错误信息

    @app.errorhandler(404)
    def page_not_found(error):
        return render_template('404.html'),404

    html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h1>404</h1>
    <h1>很抱歉!</h1>
    <p>您访问的页面不存在</p>
    </body>
    </html>!

    四、@app.before_request

    示例转自:https://www.cnblogs.com/DragonFire/p/9269303.html

    Flask我们已经学习很多基础知识了,现在有一个问题

    我们现在有一个 Flask 程序其中有3个路由和视图函数,如下:

    View Code

    如果登陆了,就可以访问 index 和 home 页面,如果没登录就跳转到 login 登录

    要怎么解决呢, session 对, 用 session 除了 Login 函数之外的所有函数里面全校验 session 是否登录了

    太麻烦了,现在咱们只有3个函数,如果成百上千个怎么整啊

    装饰器,对没错,装饰器是一个很好的方案,但是啊,我现在还是成败上千个函数,我要在每一个函数定义的时候加上@装饰器,还是很麻烦

    那么就引出了我们要学习的第一个知识点:

     @app.before_request 也是一个装饰器,他所装饰的函数,都会在请求进入视图函数之前执行

    from flask import Flask
    from flask import request
    from flask import redirect
    from flask import session
    
    app = Flask(__name__)  # type:Flask
    app.secret_key = "DragonFire"
    
    
    @app.before_request
    def is_login():
        if request.path == "/login":
            return None # 继续
         # return not None 中断
    if not session.get("user"): return redirect("/login") @app.route("/login") def login(): return "Login" @app.route("/index") def index(): return "Index" @app.route("/home") def home(): return "Login" app.run("0.0.0.0", 5000)

    request.path 是来读取当前的url地址如果是 /login 就允许直接通过 return None 你可以理解成通过放行

    校验session中是否有user 如果没有的话,证明没有登录,所以毫不留情的 redirect("/login") 跳转登录页面

    还有一个要提的 @app.before_first_request 它与 @app.before_request 极为相似或者说是一模一样,只不过它只会被执行一次

    五、@app.after_request

    @app.after_request 在响应(response)之前做出响应

    @app.after_request
    def foot_log(environ):
        if request.path != "/login":
            print("有客人访问了",request.path)
        return environ
  • 相关阅读:
    Selenium Webdriver 自动化测试开发常见问题(C#版)VS
    HTML 和 Body 在 CSS 中的区别
    安装SDK时出现Fetching https://dl-ssl.google.com/android/repository/addons_list-1.xml
    配置好Java和SDK的环境变量后,Javac不是内部命令
    关于adb连接手机offline的问题解决
    CSDN上总结的测试工具排名
    关于性能优化
    关于WAS_1
    IIS服务器搭建
    关于WAS
  • 原文地址:https://www.cnblogs.com/neymargoal/p/9922439.html
Copyright © 2020-2023  润新知