You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python函数中更新全局变量并在类中访问?

解决方案

你的代码存在两个核心问题:

  • 在authenticate函数中直接赋值token_value会创建局部变量,而非修改全局变量
  • TokenVerified类的data是类属性,会在类定义阶段就绑定全局变量的初始空值,后续全局变量更新后不会自动同步

修改步骤:

  1. 在authenticate函数中声明全局变量
    在函数内修改全局变量前,必须用global关键字声明,确保操作的是全局作用域的token_value。

  2. 调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 14:45:56