Django user login

Django is new here.

I wrote a simplified registration form that takes email and password. It works great if both email and password are supplied, but if it is missing, I get a KeyError exception. According to django documentation this should never happen:

By default, each Field class assumes that this value is necessary, so if you pass an empty value - either None or an empty string (""), then clean () will throw a ValidationError exception

I tried to write my own validators for the fields (clean_email and clean_password), but it does not work (i.e. I get a KeyError exception). What am I doing wrong?

class LoginForm(forms.Form): email = forms.EmailField(label=_(u'Your email')) password = forms.CharField(widget=forms.PasswordInput, label=_(u'Password')) def clean_email(self): data = self.cleaned_data['email'] if not data: raise forms.ValidationError(_("Please enter email")) return data def clean_password(self): data = self.cleaned_data['password'] if not data: raise forms.ValidationError(_("Please enter your password")) return data def clean(self): try: username = User.objects.get(email__iexact=self.cleaned_data['email']).username except User.DoesNotExist: raise forms.ValidationError(_("No such email registered")) password = self.cleaned_data['password'] self.user = auth.authenticate(username=username, password=password) if self.user is None or not self.user.is_active: raise forms.ValidationError(_("Email or password is incorrect")) return self.cleaned_data 
+4
source share
1 answer

You can use the built-in Django method to override how authentication works by setting AUTHENTICATION_BACKENDS in your settings.py

Here is my EmailAuthBackend:

 #settings.py AUTHENTICATION_BACKENDS = ( 'auth_backend.auth_email_backend.EmailBackend', 'django.contrib.auth.backends.ModelBackend', ) #auth_email_backend.py from django.contrib.auth.backends import ModelBackend from django.forms.fields import email_re from django.contrib.auth.models import User class EmailBackend(ModelBackend): """ Authenticate against django.contrib.auth.models.User """ def authenticate(self, **credentials): return 'username' in credentials and \ self.authenticate_by_username_or_email(**credentials) def authenticate_by_username_or_email(self, username=None, password=None): try: user = User.objects.get(email=username) except User.DoesNotExist: try: user = User.objects.get(username=username) except User.DoesNotExist: user = None if user: return user if user.check_password(password) else None else: return None def get_user(self, user_id): try: return User.objects.get(pk=user_id) except User.DoesNotExist: return None #forms.py #replaces the normal username CharField with an EmailField from django import forms from django.contrib.auth.forms import AuthenticationForm class LoginForm(AuthenticationForm): username = forms.EmailField(max_length=75, label='Email') next = forms.CharField(widget=forms.HiddenInput) 

Hope this helps!

+4
source

Source: https://habr.com/ru/post/1311356/


All Articles