【发布时间】: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'
managers.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