Flask视图类的装饰器

 

目录

 

装饰器

所有方法添加装饰器

为单个方法指定装饰器

session

特殊装饰器


装饰器

定义装饰器,判断请求头中,是否存在用户名?

  • 存在,认为用户是合法用户,允许通过
  • 不存在,拒绝用户
from flask import request


def login_auth(func):
    def wrapper(*args, **kwargs):
        # 1. 获取用户请求头中的 用户名 信息
        username = request.headers.get('USERNAME')
        # 2. 判断用户名
        if username:
            # 2.1 存在,继续执行
            return func(*args, **kwargs)
        else:
            # 2.2 不存在,拒绝访问
            return {
                       'msg': '认证失败'
                   }, 401

    return wrapper

所有方法添加装饰器

from flask_restful import Resource
from utils.auth import login_auth


# 图书的所有操作:增、查 都需要通过装饰器验证权限
class BookResource(Resource):
    method_decorators = [login_auth]

    def get(self):
        return ['图书1', '图书2']

    def post(self):
        return {
                   'name': '图书3'
               }, 201

为单个方法指定装饰器

from flask_restful import Resource
from utils.auth import login_auth


# 此时,只有图书的 添加操作需要 通过装饰器验证权限,而查询操作就不需要验证权限
class BookResource(Resource):
    method_decorators = {
        'post': [login_auth]
    }

    def get(self):
        return ['图书1', '图书2']

    def post(self):
        return {
            'name': '图书3'
        }, 201

session

视图函数中操作时实质就是字典

当请求刚进来时,flask会帮我们读取cookie中某个key对应的值,将这个值解密并反序列化成为一个字典,放入内存,以便视图函数使用。

当请求结束时,flask会读取内存中字典的值,进行序列化和加密,再写入到用户的cookie中

# 设置值
session['key']=value
# 取值
session.get('hey')
# session的配置文件
"SESSION_COOKIE_NAME": "session",
"SESSION_COOKIE_DOMAIN": None,
"SESSION_COOKIE_PATH": None,
"SESSION_COOKIE_HTTPONLY": True,
"SESSION_COOKIE_SECURE": False,
"SESSION_COOKIE_SAMESITE": None,
"SESSION_REFRESH_EACH_REQUEST": True,  # 每次请求后,过期时间都刷新 
PERMANENT_SESSION_LIFETIME=timedelta(days=1) #设置session的过期时间

特殊装饰器

前俩类似django中间件

@app.before_request  # 在请求执行前执行
@app.after_request  # 在所有请求执行完之后执行,这个装饰的函数必须接收一个response参数,并且需要返回出去

# before_request装饰的函数,谁先定义谁先执行
# after_request装饰的函数,谁后定义谁先执行
# 如果在before_request中有返回值,那么后面的before_request请求装饰的函数不会再执行,直接到最后一个after_request装饰的函数执行;这点要区别于django1.10版本以后的中间件执行流程。

@app.before_first_request  # 它装饰的函数在你启动后第一次请求才执行

@app.template_global
@app.template_filter

@app.errorhandler(404)  # 没找到页面时可以返回一个404页面
def not_found(arg):
    print(arg)
    return '没找到'

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向晚-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值