【Flask】特殊装饰器

视图函数中的装饰器

-----------------------视图中的装饰器----------------------
1、如果使用的是函数视图,那么自己定义的装饰器必须放在`app.route`下面,
否则这个装饰器起不到任何作用;
2、类视图的装饰器,需要重写类视图中的一个类属性`decorators`,这个类属性
是一个列表或元组都可以,里面装的就是左右装饰器;

app.before_request

在请求(request)进入视图函数之前执行,是全局的装饰器,每次请求都会走一遍这个装饰器,这和django的中间件很像

登录验证

from flask import Flask,render_template,send_file,request,redirect,session

app = Flask(__name__,template_folder="templates")
app.secret_key="henry"

@app.before_request  # 相当于django的中间件
def auth():
    # 白名单放行
    if request.path == "/login":
        return None
    # 判断是否是登录用户
    if session.get("username"):
        return None
    else:
        # 如果不是登录页面就会跳转到登录页面
        return redirect("login")

@app.route("/login",methods=["GET","POST"])
def login():
    if request.method=="GET":
        return render_template("login.html")
    username = request.form.get("username")
    password = request.form.get("password")
    # 判断用户名和密码是否正确
    if username=="henry" and password=="123456":
        # 登录成功后设置session
        session["username"] = username
        # 访问home页面之前会先走before_request装饰器,每个请求都会完整的走一遍before_request装饰器
        return redirect("home")
    else:
        return "用户名或密码错误"

@app.route(‘/home‘)
def home():
    return "home"

if __name__ == ‘__main__‘:
    app.run()

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

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

app.after_request

在响应(response)返回客户端之前执行 , 结束视图函数之后

@app.after_request
def foot_log(environ):
    if request.path != "/login":
        print("有客人访问了",request.path)
    return environ

请求生命周期

无异常

顺序:be1 - be2 - be3 - 视图函数 - af3 - af2 - af1

有异常

顺序:be1 - be2 - af3 - af2 - af1

errorhandler

重定义错误信息


1

2

1.有参数的装饰器errorhandler(监听错误状态码 5xx 4xx Int)

2.所装饰的函数必须有一个形参来接受 errorMessage

# 监测错误状态码
@app.errorhandler(404)   # 必须是int,而且必须是errorcode
def error(error_Message):
    # 跳转到百度的错误页面
    return redirect("https://www.baidu.com/search/error.html")

页面

app.template_global

1、用法:可以在全局范围的模板中使用这个函数, 而不用通过参数传到模板中
    @app.template_global()  # 记得加括号
    # 这个方法每调用一次就需要传一次, 将他做成一个全局的就用这么麻烦了
    def jiafa(a, b):
        return int(a) + int(b)
2、在模板中使用
    <h2>{{ jiafa(100, 30)}}</h2> 

app.template_filter

1、用法
    @app.template_filter()
    def jianfa(a, b, c):
        return a - b - c
2、在模板中这样使用
    <h2>{{ 100|jianfa(100, 300) }}</h2>

原文地址:https://www.cnblogs.com/youxiu123/p/11624296.html

时间: 2024-08-02 14:14:00

【Flask】特殊装饰器的相关文章

第七章 Flask——特殊装饰器

第七章 Flask--特殊装饰器 一.@app.template_filter() 二.@app.template_global() 三.@app.errorhandler 四.@app.errorhandler 五.@app.after_request 一.@app.template_filter() 二.@app.template_global() 三.@app.errorhandler 四.@app.errorhandler 五.@app.after_request 原文地址:https:

flask类装饰器

from flask import Flask,request,views from functools import wraps app = Flask(__name__) #自定义登录装饰器 def login_required(func): @wraps(func) def wapper(*args,**kwargs): username = request.args.get('username') if username and username == 'xiaowu': return

Flask 之装饰器有关

- 先记住一句话:自定义python装饰器时一定要记住使用@functools.wraps(func)修饰wrapper - 在Flask中使用装饰器遇到AssertionError: View function mapping is overwriting an existing... - 报错的大概意思就是存在相同的view,在flask中,如果定义了两个相同函数名的view,就会报这种报这种错误,例如: - 但是上例中的两个函数名分别是index和course,是不相同的,为什么会报这种错

flask之装饰器

在装饰前执行before_request 装饰后执行after_request 根据代码体验一下吧,看看他们的先后顺序 from flask import Flask,render_template,redirect app = Flask(__name__) @app.before_request def xx1(): print("前1") @app.before_request def xx2(): print("前2") @app.after_request

Python装饰器笔记

DRY(Don't Repeat Yourself)原则: 一般是指在写代码的时候尽量避免重复的实现.违反DRY原则导致的坏处很容易理解,例如维护困难,修改时一旦遗漏就会产生不易察觉的问题. 一.函数装饰器 1.从Python内层函数说起 使用内层函数的三个好处 封装 贯彻DRY原则 闭包和工厂函数 1.封装 def outer(num1): def inner_increment(num1): # hidden from outer code return num1 + 1 num2 = in

Flask之基于route装饰器的路由系统(源码阅读解析)

一 路由系统 1. 在flask中配置URL和视图函数的路由时,首先需要在main.py中实例化一个app对象: 1 from flask import Flask, render_template 2 3 app = Flask(__name__) 2. 然后通过app实例的route方法装饰视图函数,实现路由的配置: 1 @app.route('/') 2 def hello_world(): 3 return 'Hellow World!' 3. 所有这里需要关注在Flask类里定义的ro

Flask 给视图函数增加装饰器

在@app.route的情况下增加装饰器的写法: 1 from flask import Flask,request,render_template,redirect,session,url_for,views 2 from flask import render_template 3 4 app = Flask(__name__) #实例化flask对象 5 app.debug = True #能够随时更改自动重启,不加的话每次更改代码需要手动重启 6 app.config['SECRET_K

Flask初识,第十篇,Flask中的装饰器 before_request after_request

Flask我们已经学习很多基础知识了,现在有一个问题 我们现在有一个 Flask 程序其中有3个路由和视图函数,如下:  简单的小程序 如果登陆了,就可以访问 index 和 home 页面,如果没登录就跳转到 login 登录 要怎么解决呢, session 对, 用 session 除了 Login 函数之外的所有函数里面全校验 session 是否登录了 太麻烦了,现在咱们只有3个函数,如果成百上千个怎么整啊 装饰器,对没错,装饰器是一个很好的方案,但是啊,我现在还是成败上千个函数,我要在

Flask基础(3):session、flash、特殊装饰器、蓝图、路由正则匹配、上下文管理 &amp; flask-session

Session: Flask 默认将 session 以加密的形式放到了浏览器的 cookie 中 Flask 的 session 就是一个字典,字典有什么方法 session 就有什么方法 flask session 原理:当请求刚进来时,flask会读取cookie中 session(配置文件中能改这个名称) 对应的值,将这个值解密并反序列化成为一个字典放入内存, 以便视图函数使用: 在视图函数中使用时,按照字典的方法使用: 当请求结束时,flask会读取内存中字典的值,进行序列化+加密,然

Flask【第九章】:特殊装饰器 @app.before_request 和 @app.after_request 以及@app.errorhandler()

特殊装饰器 @app.before_request 和 @app.after_request以及@app.errorhandler() 一.背景: Flask我们已经学习很多基础知识了,现在有一个问题 我们现在有一个 Flask 程序其中有3个路由和视图函数,如下: from flask import Flask app = Flask(__name__) # type:Flask @app.route("/login") def login(): return "Login