Django项目初始化时一次性调用登录函数生成全局Token方案咨询
解决Django项目全局复用单次获取Token的方案
嘿,这个需求挺典型的,咱们完全可以通过Python模块的特性或者Django的启动机制来实现,既能保证Token只初始化一次,又不用写文件存值。给你两个实用的方案:
方案一:模块级懒加载(推荐)
利用Python模块导入时仅执行一次的特性,把Token缓存到模块变量里,第一次调用时才触发登录请求,之后直接复用缓存值。
步骤:
- 在项目里新建一个工具模块,比如
utils/auth_token.py - 写入以下代码(可以从settings里读取配置,避免硬编码):
import requests from django.conf import settings # 从Django配置中读取所需参数 BASE_URL = settings.EXTERNAL_API_BASE_URL REQUEST_HEADERS = settings.EXTERNAL_API_HEADERS LOGIN_CREDS = { "username": settings.ADMIN_API_USERNAME, "password": settings.ADMIN_API_PASSWORD } # 模块级变量,用来缓存Token,初始为None _cached_token = None def get_api_token(): global _cached_token # 只有第一次调用时才会执行登录逻辑 if _cached_token is None: response = requests.post( f"{BASE_URL}/api/admin/login", json=LOGIN_CREDS, headers=REQUEST_HEADERS, verify=False ) if response.status_code == 200: _cached_token = response.json()["token"] return _cached_token
- 在项目任意位置使用:
from utils.auth_token import get_api_token # 每次调用都返回同一个Token,仅第一次会发请求 current_token = get_api_token()
这个方案的优势是懒加载——只有真正用到Token时才会发起登录请求,而且模块变量会一直缓存Token,直到项目重启。完全符合你“重复调用用同一Token、不写文件”的要求。
方案二:Django启动时预加载Token
如果希望Token在项目启动阶段就提前获取好(而不是第一次调用时才请求),可以用Django的AppConfig.ready()方法,在项目初始化时执行登录逻辑。
步骤:
- 修改你某个App的
apps.py文件(比如your_app/apps.py):
from django.apps import AppConfig import requests from django.conf import settings class YourAppConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'your_app' # 类级变量存储Token api_token = None def ready(self): # 防止Django自动重载时重复执行(可选,开发环境有用) if self.api_token is None: base_url = settings.EXTERNAL_API_BASE_URL headers = settings.EXTERNAL_API_HEADERS creds = { "username": settings.ADMIN_API_USERNAME, "password": settings.ADMIN_API_PASSWORD } response = requests.post( f"{base_url}/api/admin/login", json=creds, headers=headers, verify=False ) if response.status_code == 200: self.api_token = response.json()["token"]
- 在
settings.py的INSTALLED_APPS中替换原来的App名称为这个配置类的路径:
INSTALLED_APPS = [ # 其他App... "your_app.apps.YourAppConfig", ]
- 在项目任意位置获取Token:
from django.apps import apps # 直接从AppConfig中拿到预加载的Token token = apps.get_app_config("your_app").api_token
这个方案适合需要在项目启动阶段就用到Token的场景,比如某些初始化逻辑依赖Token。注意:Django在runserver开发模式下可能会因为自动重载执行两次ready(),加上if self.api_token is None的判断就能避免重复请求。
额外提醒
- 不要把敏感信息(比如用户名、密码)硬编码到代码里,建议通过
os.getenv()从环境变量读取,比如settings.ADMIN_API_USERNAME = os.getenv("ADMIN_API_USER")。 - 你提到无需检测Token是否变更,所以这两个方案都完全满足;如果以后需要处理Token过期,只需要在
get_api_token()或者ready()里加过期时间判断逻辑即可。
内容的提问来源于stack exchange,提问作者yepyep
相关产品推荐
相关产品推荐

