python - “DiscordUser”对象不可迭代
问题描述
我正在尝试使用 Discord OAuth2 和自定义身份验证后端进行 login(),但出现错误。当用户第一次登录时会弹出此错误,但如果他们注销然后再次登录,它将起作用。
该错误源自 discord_user_auth = list(discord_user_auth).pop()
def discord_login_redirect(request, *args, **kwargs):
code = request.GET.get("code")
exchange_user = exchange_code(code)
discord_user_auth = DiscordAuthenticationBackend.authenticate(request=request, user=exchange_user)
discord_user_auth = list(discord_user_auth).pop()
login(request, discord_user_auth)
return redirect("/app")
def exchange_code(code: str):
data = {
"client_id": client_id,
"client_secret": "secret",
"grant_type": "authorization_code",
"code": code,
"redirect_uri": "http://localhost:8000/app/oauth2/login/redirect",
"scope": "identify guilds"
}
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
validate_token = requests.post("https://discord.com/api/oauth2/token", data=data, headers=headers)
credentials = validate_token.json()
access_token = credentials['access_token']
get_user_info = requests.get('https://discord.com/api/v9/users/@me', headers={
'Authorization': 'Bearer %s' % access_token
})
get_guilds = requests.get('https://discord.com/api/v9/users/@me/guilds', headers={
'Authorization': 'Bearer %s' % access_token
})
global guilds
guilds = get_guilds.json()
global user
user = get_user_info.json()
return user
完整追溯:
Traceback (most recent call last):
File "C:\Users\Internet\AppData\Local\Programs\Python\Python38\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "C:\Users\Internet\AppData\Local\Programs\Python\Python38\lib\site-packages\django\core\handlers\base.py", line 179, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\Internet\Desktop\Programming\Discord\exo_website\website\exo_dashboard\dashboard\home\views.py", line 186, in discord_login_redirect
discord_user_auth = list(discord_user_auth).pop()
TypeError: 'DiscordUser' object is not iterable
解决方案
因此,您的对象不是可迭代的,而是实际的用户对象。
如果它有可能通过首先检查它来返回一个可迭代对象,那么你可能会采取防御措施。
from collections.abc import Iterable
def discord_login_redirect(request, *args, **kwargs):
code = request.GET.get("code")
exchange_user = exchange_code(code)
discord_user_auth = DiscordAuthenticationBackend.authenticate(request=request, user=exchange_user)
if isinstance(discord_user_auth, Iterable):
discord_user_auth = list(discord_user_auth).pop()
login(request, discord_user_auth)
return redirect("/app")
推荐阅读
- arrays - 在过程和类对象之间移动数组
- ios - Ionic Cordova OpenTok 无法从 IOS 发布视频
- haskell - RandomGen 的 split 函数的确切语义应该是什么?
- python-3.8 - 在python中解析文本文件输入
- sql - 使用 PostgreSQL 12 在 jsonb 列的数组字段上搜索部分值
- r - 使用函数在几个原始字段上改变 df 以生成几个新列
- html - 正确对齐/定位标题图像背景
- delphi - 需要 chilkat rsa SignHashENC (sha256) 替代品
- javascript - 如何调整 discord bot 试图在指定角色内踢出超过 bot 应有的次数?
- google-cloud-platform - 通过 Google Compute Engine 和 Cloud Logging 代理使用日志严重性