Python 装饰器

基本概念
装饰器是一种强大的工具,允许你在不修改原有函数或方法代码的情况下,给其增加额外的功能。装饰器本质上是一个函数,它接受一个函数作为参数并返回一个新的函数。

基本语法

def my_decorator(func):
    def wrapper(*args,**kwargs):
        print('函数运行之前')
        result = func(*args,**kwargs)
        print('函数运行之后')
        return result
    return wrapper
@my_decorator
def my_function():
    print('函数运行中')

if __name__ == '__main__':
    my_function()


# 带参数的装饰器
def repeat(num_times):
    def decorator_repeat(func):
        def wrapper_repeat(*args,**kwargs):
            for _ in range(num_times):
                result = func(*args,**kwargs)
            return result
        return wrapper_repeat
    return decorator_repeat
@repeat(num_times=3)
def say_hello(name):
    print(f'hello {name}')
if __name__ == '__main__':
    say_hello('lucky')

check_token


# 检查token的装饰器
def check_token(func):
    def wrapper(self, *args, **kwargs):
        # 接收参数token
        token = request.headers.get('token', None)
        if not token or token == 'null':
            return make_response('token is null', 400)
        # 解码操作
        try:
            token_instance = Token()
            user = token_instance.decode(token)
            # 取出用户信息
            email = user['data']['email']

            # 查询
            # _sql = "select * from user where email='{}'".format(email)
            if r.get(email):
                # 刷新token
                token = token_instance.refresh_token(token)
                # 刷新session
                session['token'] = token
                # 刷新redis
                r.set(email, token, ex=300)
            else:
                return make_response('token is expired', 400)
        except jwt.exceptions.ExpiredSignatureError:
            return make_response('token is expired', 400)
        except jwt.exceptions.DecodeError:
            return make_response('token is error', 400)

        # 上下文变量赋值
        self.email = email
        return func(self, *args, **kwargs)



接收装饰器返回的参数

class ApiImagecode(MethodView):
    @check_token
    def get(self):
        # 使用全局 request 对象
        email = self.email
        print('接收到的参数:{}'.format(email))
        img, code = ImageCode.draw_img()
        buf = io.BytesIO()
        img.save(buf, 'jpeg')
        response = make_response(buf.getvalue())
        response.headers['Content-Type'] = 'image/jpeg'
        return response

posted @ 2024-12-05 16:46  乐乐乐乐乐乐樂  阅读(12)  评论(0)    收藏  举报
jQuery火箭图标返回顶部代码