前置
在 开发日常踩坑之 - - 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() 一个页面方法能只能存在一个,那么 就把它都封装起来,页面单独调用,这样既方便维护,也方便使用