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_name
in Ihrem Modell, aber username
im authenticate
Gespräch.
Ich würde sagen, dass es vorzuziehen ist, username
in 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 User
Modell sein. Sie haben default=False
für das Feld active
, also überprüfen Sie auch, ob Ihr Benutzer aktiv ist. Da ModelBackend
checkt die is_active
Methode ein user_can_authenticate
- https://github.com/django/django/blob/master/django/contrib/auth/backends.py#L51
Keine Kommentare:
Kommentar veröffentlichen