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

Django项目初始化时一次性调用登录函数生成全局Token方案咨询

解决Django项目全局复用单次获取Token的方案

嘿,这个需求挺典型的,咱们完全可以通过Python模块的特性或者Django的启动机制来实现,既能保证Token只初始化一次,又不用写文件存值。给你两个实用的方案:

方案一:模块级懒加载(推荐)

利用Python模块导入时仅执行一次的特性,把Token缓存到模块变量里,第一次调用时才触发登录请求,之后直接复用缓存值。

步骤:

  1. 在项目里新建一个工具模块,比如utils/auth_token.py
  2. 写入以下代码(可以从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
  1. 在项目任意位置使用:
from utils.auth_token import get_api_token

# 每次调用都返回同一个Token,仅第一次会发请求
current_token = get_api_token()

这个方案的优势是懒加载——只有真正用到Token时才会发起登录请求,而且模块变量会一直缓存Token,直到项目重启。完全符合你“重复调用用同一Token、不写文件”的要求。

方案二:Django启动时预加载Token

如果希望Token在项目启动阶段就提前获取好(而不是第一次调用时才请求),可以用Django的AppConfig.ready()方法,在项目初始化时执行登录逻辑。

步骤:

  1. 修改你某个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"]
  1. 在settings.py的INSTALLED_APPS中替换原来的App名称为这个配置类的路径:
INSTALLED_APPS = [
    # 其他App...
    "your_app.apps.YourAppConfig",
]
  1. 在项目任意位置获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:44:06