我正在使用扩展的烧瓶JWT(https://pypi.org/project/Flask-JWT-Extended/)来保护我的烧瓶应用程序。jwt_required
装饰器将optional
作为参数。然而,我的flask应用程序是在类中创建的,在实例化该类之前,我无法设置optional
参数。以下是我尝试过的:
from flask import Flask, jsonify
from flask_jwt_extended import jwt_required, JWTManager
jwt_optional = False
class Node:
def __init__(self, name: str, key: str, jwt_opt: bool = False):
self.app = Flask(name)
self.app.config['SECRET_KEY'] = key
global jwt_optional
jwt_optional = jwt_opt
self.app.add_url_rule(rule='/get_token',
endpoint='get_token',
view_func=self.get_token,
methods=['GET'])
@jwt_required(optional=jwt_optional)
def get_token(self):
print('Token success')
return jsonify({'msg': 'Token success'})
if __name__ == '__main__':
node = Node('Test Node', key='unsafe', jwt_opt=True)
app = node.app
app.config['TESTING'] = True
jwt = JWTManager(app=app)
test_app = app.test_client()
response = test_app.get('/get_token')
print(response.json)
我想很明显,它不起作用,因为在我更改全局变量之前对decorator进行了评估。
是否可以在运行时使令牌可选?
我还必须处理可选JWT的情况。我最终做的是将decorator放在一个通用函数的顶部,然后在路由过程中简单地调用该函数——或者跳过它,如果jwt_optial是True
jwt_optional = True
@jwt_required()
def jwt_protection():
pass
# ...
class Node:
# ...
def get_token(self):
if jwt_optional is False:
jwt_protection()
print('Token success')
return jsonify({'msg': 'Token success'})
我认为这是一个简单的解决方法,它也可能对您的情况有所帮助