GOOGLE ADS

Sonntag, 24. April 2022

Django authenticate() gibt für ein benutzerdefiniertes Modell immer None zurück

Ich bin neu bei Django und muss damit ein Back-End erstellen. Mein Problem: Ich habe mehrere Modelle (Kunden, Fahrer, Unternehmen), die sich alle anmelden und authentifizieren sollten (jedes in einer anderen App, aber alle erweitern dasselbe Benutzermodell). Ich habe so viele Fragen wie diese gesehen, aber keine von ihnen hat mein Problem gelöst, das authentifiziert ist (Benutzername = 'Benutzername', Passwort = 'Passwort') gibt immer keine zurück. Der Benutzerdatensatz existiert in der DB, ich habe ihn mit filter(username=(username) überprüft. Hier ist also ein Code:

Die UserManager-Klasse:

class UserManager(BaseUserManager):
def create_user(self, username, password, phone):
if not username:
raise ValueError("user must provide a username")
if not password:
raise ValueError("user must provide a password")
if not phone:
raise ValueError("user must povide a phone number")
user_obj = self.model(
user_name=username,
phone=phone
)
user_obj.set_password(password)
user_obj.save()
return user_obj

die Benutzerklasse:

class User(AbstractBaseUser):
user_name = models.CharField(max_length=32, unique=True)
email = models.EmailField(max_length=255, unique=True, null=True)
phone = PhoneNumberField()
access_token = models.CharField(max_length=255, unique=True, null=True)
notifications_token = models.CharField(max_length=255, unique=True, null=True)
photo = models.ImageField()
person_in_contact = models.CharField(max_length=32)
active = models.BooleanField(default=False)
confirmedEmail = models.BooleanField(default=False)
confirmedPhone = models.BooleanField(default=False)
completedProfile = models.BooleanField(default=False)
objects = UserManager()
@property
def is_active(self):
return self.active
def __str__(self):
return "Client: " + self.user_name + " Email:" + self.email
def get_email(self):
return self.email
USERNAME_FIELD = 'user_name'
REQUIRED_FIELDS = ['username', 'phone', 'password']
class Meta:
abstract = True

Personenklasse (Auftraggeber und Fahrer geht davon aus):

class Person(User):
GENDER = (('F', 'FEMALE'), ('M', 'MALE'))
name = models.CharField(max_length=50, null=True)
surname = models.CharField(max_length=50, null=True)
adress = models.CharField(max_length=255, null=True)
birth_date = models.DateField(null=True)
gender = models.CharField(max_length=1, choices=GENDER, default='M')
def age(self):
today = date.today()
return today.year - self.birth_date.year
def __str__(self):
return super().__str__() + " Name: " + self.name
class Meta:
abstract = True

Hier ist das Treibermodell, mit dem ich teste (wenn dies gelingt, wende ich dieselbe Methode auf die beiden anderen Modelle an):

class Driver(Person):
rating = models.DecimalField(default=0, decimal_places=1, max_digits=3)
driving_license = models.CharField(max_length=50, null=True)
insurance_number = models.CharField(max_length=50, null=True)
company = models.ForeignKey(TransportCompany, on_delete=models.DO_NOTHING, null=True)

Mein Ordner settings.py ist eingerichtet:

AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
)
AUTH_USER_MODEL = 'drivers.Driver'

und hier ist, wie ich in der Python-Konsole teste:

>>> from django.contrib.auth import authenticate
>>> print (authenticate(username='Simouchee',password='123456789'))
None

und wenn ich mit filter teste und existiert:

>>> driver = Driver.objects.filter(user_name = 'Simouchee')
>>> driver.exists()
True

Jede Hilfe/Hinweis, wie benutzerdefinierte Modelle richtig authentifiziert werden, ist willkommen. Entschuldigung für den langen Thread, ich hatte das Bedürfnis, ihn ausführlich zu erklären.


Lösung des Problems

Sie haben hier einen Fehlerauthenticate(username='Simouchee',password='123456789')

Sie haben user_namein Ihrem Modell, aber usernameim authenticateGespräch.

Ich würde sagen, dass es vorzuziehen ist, usernamein Ihrem Modell auf die gleiche Weise wie im Django-Framework selbst keinen Unterstrich zu haben - https://github.com/django/django/blob/master/django/contrib/auth/models.py# L299

Überprüfen Sie auch das Passwort, wie hier erwähnt - Django authenticate() gibt immer None für ein benutzerdefiniertes Modell zurück

Bearbeitet: Problem kann im UserModell sein. Sie haben default=Falsefür das Feld active, also überprüfen Sie auch, ob Ihr Benutzer aktiv ist. Da ModelBackendcheckt die is_activeMethode ein user_can_authenticate- https://github.com/django/django/blob/master/django/contrib/auth/backends.py#L51

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...