Anonymous
Плохо ли написан мой собственный бэкэнд аутентификации в Django?
Сообщение
Anonymous » 08 янв 2026, 01:03
Я пытаюсь реализовать собственный сервер аутентификации в Django; моя пользовательская модель аутентификации и моя пользовательская форма создания пользователя работают нормально, но когда я пытаюсь войти в систему, используя свой собственный сервер аутентификации, возникает это исключение.
Код: Выделить всё
Internal Server Error: /login/
Traceback (most recent call last):
File "C:\Users\G-FIVE\Desktop\Projects\revenue\venv\Lib\site-packages\django\core\handlers\exception.py", line 55, in inner
response = get_response(request)
^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\G-FIVE\Desktop\Projects\revenue\venv\Lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\Projects\revenue\authentication\views.py", line 12, in login
usuario = UsuarioAuthBackend.authenticate(request, email=email, password=password)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: UsuarioAuthBackend.authenticate() missing 1 required positional argument: 'request'
[09/Jun/2023 10:47:15] "POST /login/ HTTP/1.1" 500 66119
Он сообщает мне, что мне не хватает 1 обязательного позиционного аргумента, запроса.
Но этот аргумент был передан в коде, я поделюсь своим кодом.
Модель пользовательского пользователя:
Код: Выделить всё
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
# choices
CALIFICACION_USUARIO_CHOICES = [
(0,0),
(1,1),
(2,2),
(3,3),
(4,4)
]
# Create your models here.
class UsuarioManager(BaseUserManager):
use_in_migrations = True
def _create_user(self, email, password, **extra_fields):
if not email:
raise ValueError('El usuario debe tener un correo electrónico')
email = self.normalize_email(email)
usuario = self.model(email=email, **extra_fields)
usuario.set_password(password)
usuario.save(using=self._db)
return usuario
def create_user(self, email=None, password=None, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', False)
return self._create_user(email, password, **extra_fields)
def create_superuser(self, email, password, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superusuario debe tener la propiedad "is_staff=True"')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superusuario debe tener la propiedad "is_superuser=True"')
return self._create_user(email, password, **extra_fields)
class Usuario(AbstractBaseUser):
first_name = models.CharField(verbose_name='Nombre', max_length=255)
last_name = models.CharField(verbose_name='Apellidos', max_length=255, blank=True, null=True)
email = models.EmailField(verbose_name='Correo', unique=True, max_length=255)
cedula = models.CharField(verbose_name='Cédula de Identidad', null=False, blank=False, max_length=255)
telefono = models.CharField(verbose_name='Teléfono', max_length=255, null=False, blank=False)
calificacion = models.SmallIntegerField(verbose_name='Calificación', null=False, blank=False, choices=CALIFICACION_USUARIO_CHOICES, default=0)
direccion = models.TextField(verbose_name='Dirección', null=True, blank=True)
foto_perfil = models.ImageField(verbose_name='Foto de perfil', max_length=255, null=True, blank=True, upload_to='perfil/')
terminos_y_condiciones = models.BooleanField(verbose_name='Términos y condiciones', default=False)
is_active = models.BooleanField(verbose_name='active',default=True)
is_staff = models.BooleanField(verbose_name='staff status', default=False)
is_superuser = models.BooleanField(verbose_name='superuser status', default=False)
objects = UsuarioManager()
USERNAME_FIELD = 'email'
def __str__(self):
return f'{self.first_name} {self.last_name}'
def has_perm(self,perm,obj=None):
return True
def has_module_perms(self,app_label):
return True
def get_email_user(self):
return self.email.lower()
def save(self, *args, **kwargs):
self.email = self.email.lower()
return super(Usuario, self).save(*args, **kwargs)
class Meta:
verbose_name = 'Usuario'
verbose_name_plural = 'Usuarios'
ordering = ['-id']
Пользовательский серверный код:
Код: Выделить всё
from django.contrib.auth.backends import ModelBackend
from authentication.models import Usuario
class UsuarioAuthBackend(ModelBackend):
def authenticate(self, request, **kwargs):
email = kwargs['email']
password = kwargs['password']
try:
usuario = Usuario.objects.get(email=email)
if usuario.check_password(password) is True:
return usuario
except Usuario.DoesNotExist:
return None
Представление, использующее этот пользовательский сервер:
Код: Выделить всё
from django.shortcuts import render, redirect
from django.contrib.auth import login, logout
from authentication.authentication import UsuarioAuthBackend
from authentication.forms import FormUsuario
# Create your views here.
def login(request):
if request.method == 'POST':
email = request.POST['email']
password = request.POST['password']
usuario = UsuarioAuthBackend.authenticate(request, email=email, password=password)
if usuario is not None:
login(request, usuario)
return redirect('home')
return render(request, 'login.html')
Я добавил в свой файл settings.py следующие строки:
Код: Выделить всё
AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend',
'authentication.authentication.UsuarioAuthBackend'
]
Если кто-нибудь сможет помочь мне решить эту проблему, я буду очень благодарен!!!
Подробнее здесь:
https://stackoverflow.com/questions/764 ... -in-django
1767823385
Anonymous
Я пытаюсь реализовать собственный сервер аутентификации в Django; моя пользовательская модель аутентификации и моя пользовательская форма создания пользователя работают нормально, но когда я пытаюсь войти в систему, используя свой собственный сервер аутентификации, возникает это исключение. [code]Internal Server Error: /login/ Traceback (most recent call last): File "C:\Users\G-FIVE\Desktop\Projects\revenue\venv\Lib\site-packages\django\core\handlers\exception.py", line 55, in inner response = get_response(request) ^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\G-FIVE\Desktop\Projects\revenue\venv\Lib\site-packages\django\core\handlers\base.py", line 197, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Projects\revenue\authentication\views.py", line 12, in login usuario = UsuarioAuthBackend.authenticate(request, email=email, password=password) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TypeError: UsuarioAuthBackend.authenticate() missing 1 required positional argument: 'request' [09/Jun/2023 10:47:15] "POST /login/ HTTP/1.1" 500 66119 [/code] Он сообщает мне, что мне не хватает 1 обязательного позиционного аргумента, запроса. [img]https://i.sstatic.net/cO5zO.png[/img] Но этот аргумент был передан в коде, я поделюсь своим кодом. Модель пользовательского пользователя: [code]from django.db import models from django.contrib.auth.models import AbstractBaseUser, BaseUserManager # choices CALIFICACION_USUARIO_CHOICES = [ (0,0), (1,1), (2,2), (3,3), (4,4) ] # Create your models here. class UsuarioManager(BaseUserManager): use_in_migrations = True def _create_user(self, email, password, **extra_fields): if not email: raise ValueError('El usuario debe tener un correo electrónico') email = self.normalize_email(email) usuario = self.model(email=email, **extra_fields) usuario.set_password(password) usuario.save(using=self._db) return usuario def create_user(self, email=None, password=None, **extra_fields): extra_fields.setdefault('is_staff', True) extra_fields.setdefault('is_superuser', False) return self._create_user(email, password, **extra_fields) def create_superuser(self, email, password, **extra_fields): extra_fields.setdefault('is_staff', True) extra_fields.setdefault('is_superuser', True) if extra_fields.get('is_staff') is not True: raise ValueError('Superusuario debe tener la propiedad "is_staff=True"') if extra_fields.get('is_superuser') is not True: raise ValueError('Superusuario debe tener la propiedad "is_superuser=True"') return self._create_user(email, password, **extra_fields) class Usuario(AbstractBaseUser): first_name = models.CharField(verbose_name='Nombre', max_length=255) last_name = models.CharField(verbose_name='Apellidos', max_length=255, blank=True, null=True) email = models.EmailField(verbose_name='Correo', unique=True, max_length=255) cedula = models.CharField(verbose_name='Cédula de Identidad', null=False, blank=False, max_length=255) telefono = models.CharField(verbose_name='Teléfono', max_length=255, null=False, blank=False) calificacion = models.SmallIntegerField(verbose_name='Calificación', null=False, blank=False, choices=CALIFICACION_USUARIO_CHOICES, default=0) direccion = models.TextField(verbose_name='Dirección', null=True, blank=True) foto_perfil = models.ImageField(verbose_name='Foto de perfil', max_length=255, null=True, blank=True, upload_to='perfil/') terminos_y_condiciones = models.BooleanField(verbose_name='Términos y condiciones', default=False) is_active = models.BooleanField(verbose_name='active',default=True) is_staff = models.BooleanField(verbose_name='staff status', default=False) is_superuser = models.BooleanField(verbose_name='superuser status', default=False) objects = UsuarioManager() USERNAME_FIELD = 'email' def __str__(self): return f'{self.first_name} {self.last_name}' def has_perm(self,perm,obj=None): return True def has_module_perms(self,app_label): return True def get_email_user(self): return self.email.lower() def save(self, *args, **kwargs): self.email = self.email.lower() return super(Usuario, self).save(*args, **kwargs) class Meta: verbose_name = 'Usuario' verbose_name_plural = 'Usuarios' ordering = ['-id'] [/code] Пользовательский серверный код: [code]from django.contrib.auth.backends import ModelBackend from authentication.models import Usuario class UsuarioAuthBackend(ModelBackend): def authenticate(self, request, **kwargs): email = kwargs['email'] password = kwargs['password'] try: usuario = Usuario.objects.get(email=email) if usuario.check_password(password) is True: return usuario except Usuario.DoesNotExist: return None [/code] Представление, использующее этот пользовательский сервер: [code]from django.shortcuts import render, redirect from django.contrib.auth import login, logout from authentication.authentication import UsuarioAuthBackend from authentication.forms import FormUsuario # Create your views here. def login(request): if request.method == 'POST': email = request.POST['email'] password = request.POST['password'] usuario = UsuarioAuthBackend.authenticate(request, email=email, password=password) if usuario is not None: login(request, usuario) return redirect('home') return render(request, 'login.html') [/code] Я добавил в свой файл settings.py следующие строки: [code]AUTHENTICATION_BACKENDS = [ 'django.contrib.auth.backends.ModelBackend', 'authentication.authentication.UsuarioAuthBackend' ] [/code] Если кто-нибудь сможет помочь мне решить эту проблему, я буду очень благодарен!!! Подробнее здесь: [url]https://stackoverflow.com/questions/76441411/is-it-bad-written-my-custom-authentication-backend-in-django[/url]