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

Django项目中如何根据OAuth选择全局设置CLIENT_ID与CLIENT_SECRET

Django OAuth账户切换问题

我正在做第一个Django项目,被一个问题卡了好几周。现在每个视图里都要用到CLIENT_ID和CLIENT_SECRET,页面上做了个下拉菜单用来选要使用的OAuth账户。

菜单截图:显示包含Auth 1、Auth 2、Auth 3、Auth 4选项的Bootstrap下拉选择框

HTML代码片段

<h2>Select Menu</h2>
<p>To style a select menu in Bootstrap 5, add the .form-select class to the select element:</p>
<label for="cust" class="form-label">Select list (select one):</label>
<select class="form-select" id="cust" name="customer">
  <option>Auth 1</option>
  <option>Auth 2</option>
  <option>Auth 3</option>
  <option>Auth 4</option>
</select>
<input type="submit" value="click" class="btn btn-primary">

Views.py代码片段

def data(request):
    # OAuth when using Client Credentials
    CLIENT_ID = CLIENT_ID
    CLIENT_SECRET = CLIENT_SECRET

def getdata(request):
    # OAuth when using Client Credentials
    CLIENT_ID = CLIENT_ID
    CLIENT_SECRET = CLIENT_SECRET

需求

选完下拉里的Auth账户后,让所有视图都用对应的CLIENT_ID和CLIENT_SECRET,最终要结合dotenv使用。现在搞不定怎么获取用户的选择,然后给每个视图设置这些凭证。


解决方案

1. 用dotenv存储多组OAuth凭证

在项目根目录的.env文件里按账户分组存凭证:

# Auth 1
AUTH1_CLIENT_ID=你的Auth1客户端ID
AUTH1_CLIENT_SECRET=你的Auth1客户端密钥

# Auth 2
AUTH2_CLIENT_ID=你的Auth2客户端ID
AUTH2_CLIENT_SECRET=你的Auth2客户端密钥

# Auth 3
AUTH3_CLIENT_ID=你的Auth3客户端ID
AUTH3_CLIENT_SECRET=你的Auth3客户端密钥

# Auth 4
AUTH4_CLIENT_ID=你的Auth4客户端ID
AUTH4_CLIENT_SECRET=你的Auth4客户端密钥

2. 完善表单提交逻辑

给HTML表单加上提交地址和CSRF令牌(Django必须),同时给选项加上对应的值:

<form method="POST" action="{% url 'set_auth_account' %}">
  {% csrf_token %}
  <h2>选择OAuth账户</h2>
  <label for="cust" class="form-label">请选择要使用的账户:</label>
  <select class="form-select" id="cust" name="customer">
    <option value="auth1">Auth 1</option>
    <option value="auth2">Auth 2</option>
    <option value="auth3">Auth 3</option>
    <option value="auth4">Auth 4</option>
  </select>
  <input type="submit" value="确认选择" class="btn btn-primary mt-3">
</form>

3. 保存选择到Session

写个视图处理表单提交,把用户选的账户标识存在session里,这样后续所有请求都能拿到:

# views.py
from django.shortcuts import redirect, render

def set_auth_account(request):
    if request.method == 'POST':
        selected_auth = request.POST.get('customer')
        # 校验选择的合法性
        if selected_auth in ['auth1', 'auth2', 'auth3', 'auth4']:
            request.session['selected_auth'] = selected_auth
    # 提交后跳回主页面或者你需要的页面
    return redirect('home')

在urls.py里给这个视图加个路由:

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    # 其他路由...
    path('set-auth/', views.set_auth_account, name='set_auth_account'),
]

4. 封装凭证获取工具

写个工具函数,根据session里的选中项自动取对应的凭证:

# utils.py
from django.conf import settings

def get_current_oauth_credentials(request):
    # 默认用Auth1,防止用户没选的情况
    selected_auth = request.session.get('selected_auth', 'auth1')
    # 从settings里取对应的值
    client_id = getattr(settings, f"{selected_auth.upper()}_CLIENT_ID")
    client_secret = getattr(settings, f"{selected_auth.upper()}_CLIENT_SECRET")
    return client_id, client_secret

5. 在视图中使用凭证

现在所有视图直接调用这个工具函数就能拿到对应账户的凭证了:

# views.py
from .utils import get_current_oauth_credentials

def data(request):
    CLIENT_ID, CLIENT_SECRET = get_current_oauth_credentials(request)
    # 这里写你的OAuth逻辑,直接用这两个变量就行
    # ...

def getdata(request):
    CLIENT_ID, CLIENT_SECRET = get_current_oauth_credentials(request)
    # 这里写你的OAuth逻辑
    # ...

6. 配置settings加载dotenv

在settings.py里确保加载了.env文件,把凭证读进来:

# settings.py
from dotenv import load_dotenv
import os

# 加载.env文件
load_dotenv()

# 读取各账户的凭证
AUTH1_CLIENT_ID = os.getenv('AUTH1_CLIENT_ID')
AUTH1_CLIENT_SECRET = os.getenv('AUTH1_CLIENT_SECRET')

AUTH2_CLIENT_ID = os.getenv('AUTH2_CLIENT_ID')
AUTH2_CLIENT_SECRET = os.getenv('AUTH2_CLIENT_SECRET')

AUTH3_CLIENT_ID = os.getenv('AUTH3_CLIENT_ID')
AUTH3_CLIENT_SECRET = os.getenv('AUTH3_CLIENT_SECRET')

AUTH4_CLIENT_ID = os.getenv('AUTH4_CLIENT_ID')
AUTH4_CLIENT_SECRET = os.getenv('AUTH4_CLIENT_SECRET')

内容的提问来源于stack exchange,提问作者1int3grat0r

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:45:29