开发日常踩坑之 - - Flask中的蓝图(Blueprints)与 jwt装饰器(@jwt_required)并存

175 阅读2分钟

前置

开发日常踩坑之 - - Flask中的蓝图(Blueprints)的 jwt装饰器(@jwt_required)陷害 文章中 ,提供了解决蓝图与 jwt装饰器 使用问题,但使用过程中,会发现 依旧没有饶过 jwt装饰器 唯一性的坑

存在的bug:

在 同一个 接口 class 中 如果需要同时使用多个 jwt装饰器(@jwt_required) 的情况下,会报错

那么,该如何解决呢?

正文

解决的方法也很简单,并且不用在 修改原来的蓝图模式,废话不说了,上代码: sys.py 中通过 方法引用


import os
import sys

from flask import Blueprint, request
from api.urlSet import MyEnum
from public.commonUse import otherUse
from jwtGO.py_jwt import get_new_token, destroy_token


class service():
    def __init__(self):
        self.bp = Blueprint("sys", __name__, url_prefix="/sys")

        self.Myenum = MyEnum()
        self.usego = otherUse()

        # 将路由和视图函数绑定到蓝图
        self.bp.route(self.Myenum.SYS_LOGIN, methods=['POST'])(self.sys_login)
        self.bp.route(self.Myenum.SYS_LOGOUT, methods=['DELETE'])(self.sys_logout)




    def sys_user_login(self):
        form_data = request.json
        username = form_data['username']
        password = form_data['password']

        try:
            datas = get_new_token(resdatas[0]["id"])
        except:
            self.usego.sendlog(f'请检查账号/密码是否正确:{sql_data}')
            res = ResMsg(code='B0001', msg=f'请检查账号/密码是否正确')
            responseData = res.to_json()

            return responseData
        else:

            res = ResMsg(data=datas)
            responseData = res.to_json()

            return responseData

    def sys_user_logout(self):
        # 黑名单集合

        result = destroy_token()

        self.usego.sendlog(f'请检查账号/密码是否正确:{result}')
        res = ResMsg()
        responseData = res.to_json()
        return responseData


py_jwt.py


from flask_jwt_extended import create_access_token, create_refresh_token, jwt_required, get_jwt_identity, get_jwt

def get_new_token(userid):

    access_token = create_access_token(identity=userid)
    refresh_token = create_refresh_token(identity=userid)
    datas = {
        'accessToken': access_token,
        'expires': 15 * 60 * 1000,  # 转换为毫秒
        'refreshToken': refresh_token,
        'tokenType': 'Bearer'
    }
    return datas


@jwt_required(refresh=True)
def get_refresh_token():
    current_user_id = get_jwt_identity()
    new_access_token = create_access_token(identity=current_user_id)
    return new_access_token

@jwt_required()
def get_verify_token():

    user_id = get_jwt_identity()
    return user_id


@jwt_required()
def destroy_token():
    # 黑名单集合
    BLACKLIST = set()
    jti = get_jwt()['jti']  # 获取JWT的唯一标识符
    user_id = get_jwt_identity()  # 从JWT获取用户ID
    BLACKLIST.add(jti)  # 将JWT添加到黑名单中

    return True

看了代码,是不是就有种 “哦~原来,就这” 没错,就是 打不过就加入的原则,既然 @jwt_required() 一个页面方法能只能存在一个,那么 就把它都封装起来,页面单独调用,这样既方便维护,也方便使用