【问题标题】:AttributeError: 'method' object has no attribute 'backend'AttributeError:“方法”对象没有属性“后端”
【发布时间】:2021-04-05 21:25:50
【问题描述】:

当我尝试创建自定义身份验证系统时,我从 Django 收到此错误。我很确定这是来自我的views.py,但我不知道如何解决它。我处理的所有代码都在下面。我做了一些打印语句来查看代码是否在某处中断,我发现views.py 中的authenticate(request, user=user) 停止了导致auth.py 和managers.py 不触发的代码。

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\Ξ X 0 Website\Ξ X 0 Dashboard\dashboard\home\views.py", line 12, in home_view
    authenticate(request, user=user)
  File "C:\Users\Internet\AppData\Local\Programs\Python\Python38\lib\site-packages\django\contrib\auth\__init__.py", line 80, in authenticate
    user.backend = backend_path
AttributeError: 'method' object has no attribute 'backend'

ma​​nagers.py

from django.contrib.auth import models

class DiscordUserOAuth2Manager(models.UserManager):
    def create_new_discord_user(self, user):
        print('Inside Discord User Manager')
        discord_tag = '%s#%s' % (user['username'], user['discriminator'])
        new_user = self.create(
            id=user['id'],
            avatar=user['avatar'],
            public_flags=user['public_flags'],
            flags=user['flags'],
            locale=user['locale'],
            mfa_enabled=user['mfa_enabled'],
            discord_tag=discord_tag
        )
        return new_user

auth.py

from django.contrib.auth.backends import BaseBackend
from .models import DiscordUser
from django.contrib.auth.models import User

class DiscordAuthenticationBackend(BaseBackend):
    def authenticate(self, request, user):
        find_user = DiscordUser.objects.filter(id=user['id'])
        if len(find_user) == 0:
            print("User was not found. Saving...")
            new_user = DiscordUser.objects.create_new_discord_user
            (user)
            print(new_user)
            return new_user
        return find_user

models.py

from django.db import models
from .managers import DiscordUserOAuth2Manager

class DiscordUser(models.Model):
    objects = DiscordUserOAuth2Manager()

    id = models.BigIntegerField(primary_key=True)
    discord_tag = models.CharField(max_length=100)
    avatar = models.CharField(max_length=100)
    public_flags = models.BigIntegerField()
    flag = models.IntegerField()
    locale = models.CharField(max_length=100)
    mfa_enabled = models.BooleanField()
    last_login = models.DateTimeField(null=True)

views.py

from django.shortcuts import render
from django.http import HttpResponse, HttpRequest
from django.shortcuts import redirect
from django.contrib.auth import authenticate, login
import requests

client_id = "my_id"

def home_view(request: HttpRequest, *args, **kwargs):
    code = request.GET.get("code")
    user = exchange_code(code)
    authenticate(request, user=user)
    return render(request, "home.html", {})

def exchange_code(code: str):
    data = {
        "client_id": client_id,
        "client_secret": "my_secret",
        "grant_type": "authorization_code",
        "code": code,
        "redirect_uri": "http://localhost:8000/home/",
        "scope": "identify guilds"
    }

    headers = {
        'Content-Type': 'application/x-www-form-urlencoded'
    }

    response = requests.post("https://discord.com/api/oauth2/token", data=data, headers=headers)
    credentials = response.json()
    
    access_token = credentials['access_token']
    response = requests.get('https://discord.com/api/v6/users/@me', headers={
        'Authorization': 'Bearer %s' % access_token
    })
    print(response)
    user = response.json()
    print(user)
    return user

settings.py

AUTHENTICATION_BACKENDS = [
    'home.auth.DiscordAuthenticationBackend'
]

【问题讨论】:

    标签: python python-3.x django django-models django-views


    【解决方案1】:

    而不是在后端 authenticate 方法中返回用户实例,而是返回用户的 QuerySet(集合),给您一个错误。所以你的后端应该是这样的:

    class DiscordAuthenticationBackend(BaseBackend):
        def authenticate(self, request, user):
            try:
                return_user = DiscordUser.objects.get(id=user['id'])
            except DiscordUser.DoesNotExist:
                print("User was not found. Saving...")
                return_user = DiscordUser.objects.create_new_discord_user(user)
                print(new_user)
            return return_user
    

    注意:理想情况下,您的函数 exchange_code 应该在这里成为后端的一部分,因为它处理来自某些用户的身份验证 代码/密钥。您的 authenticate 方法应该接受代码作为 凭据而不是用户详细信息的字典。

    【讨论】:

      猜你喜欢
      • 2020-05-13
      • 2018-04-11
      • 2020-01-18
      • 1970-01-01
      • 2018-05-09
      • 2012-12-01
      • 2021-04-19
      • 2021-11-22
      • 1970-01-01
      相关资源
      最近更新 更多