如何在Python函数中更新全局变量并在类中访问?
解决方案
你的代码存在两个核心问题:
- 在
authenticate函数中直接赋值token_value会创建局部变量,而非修改全局变量 TokenVerified类的data是类属性,会在类定义阶段就绑定全局变量的初始空值,后续全局变量更新后不会自动同步
修改步骤:
在
authenticate函数中声明全局变量
在函数内修改全局变量前,必须用global关键字声明,确保操作的是全局作用域的token_value。调整
TokenVerified的data属性为实例属性
类属性只会初始化一次,改成实例属性后,每次创建TokenVerified实例时都会获取最新的全局token_value值。
修改后的完整代码:
import jwt import os from dotenv import load_dotenv load_dotenv() from rest_framework.exceptions import APIException jwtPrivateKey = os.environ.get('SECRET_KEY') # 全局声明变量 token_value = "" def authenticate(auth_header_value): global token_value # 声明要修改全局变量 try: if auth_header_value is not None: if len(auth_header_value.split(" ", 1)) == 2: authmeth, auth = auth_header_value.split(" ", 1) if authmeth.lower() not in ["bearer", "basic"]: return TokenNotBearer() # 更新全局token_value的值 token_value = jwt.decode( jwt=auth, key=jwtPrivateKey, algorithms=['HS256'] ) return TokenVerified() else: return TokenNotBearer() else: return TokenNotProvided() except (TokenExpiredOrInvalid, jwt.DecodeError): return TokenExpiredOrInvalid() # 令牌过期或无效时的异常类 class TokenExpiredOrInvalid(APIException): status_code = 403 default_detail = "Invalid/Expired token" default_code = "forbidden" # 未提供令牌时的异常类 class TokenNotProvided(APIException): status_code = 401 default_detail = "Access denied. Authorization token must be provided" default_code = "unauthorized" # 令牌未以Bearer方式提供时的异常类 class TokenNotBearer(APIException): status_code = 401 default_detail = "Access denied. Authorization token must be Bearer [token]" default_code = "token not bearer" # 令牌验证通过时的返回类 class TokenVerified(): status_code = 200 default_detail = "Token verified Successfully" default_code = "verified" def __init__(self): # 实例化时获取最新的全局token_value self.data = token_value
补充说明:
- 使用
global关键字后,authenticate函数内的赋值操作会直接修改全局的token_value TokenVerified的__init__方法会在每次创建实例时(也就是return TokenVerified()时)将最新的token_value赋值给实例的data属性,确保获取到的是更新后的值- 额外优化了
authmeth的判断逻辑,用in关键字让代码更简洁
内容的提问来源于stack exchange,提问作者Ritika
相关产品推荐
相关产品推荐

