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
相关产品推荐
相关产品推荐

