第七章 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
原文地址:https://www.cnblogs.com/neymargoal/p/9922439.html