首页 > 解决方案 > “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

标签: pythondjangodjango-viewsdiscord

解决方案


因此,您的对象不是可迭代的,而是实际的用户对象。

如果它有可能通过首先检查它来返回一个可迭代对象,那么你可能会采取防御措施。

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")

推荐阅读