O Django não armazena campo de senha no modelo de usuário
Criei uma página de inscrição usando os formulários de inscrição incorporados do Django.
forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
class SignUpForm(UserCreationForm):
email = forms.EmailField(max_length=254, help_text='Please provide a valid email address.')
class Meta:
model = User
fields = ('username', 'email', 'password1', 'password2')
def clean(self):
cleaned_data = super(SignUpForm, self).clean()
username = cleaned_data.get("username")
email = cleaned_data.get("email")
check_email = User.objects.filter(email=email)
if check_email:
raise forms.ValidationError(
"You are already registered!")
return cleaned_data
check_username = User.objects.filter(username=username)
if check_username:
raise forms.ValidationError(
"A user with that username already exists")
return cleaned_data
Em meu views.py, é assim que faço a autenticação para inscrição
views.py
@csrf_exempt
def signup_users(request):
if request.method == 'POST':
form = SignUpForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
raw_password = form.cleaned_data.get('password1')
user = authenticate(username=username, password=raw_password)
print("signup authencticate", user)
login(request, user)
return redirect('/')
else:
form = SignUpForm()
return render(request, 'signup.html', {'form': form})
Aqui está o meu código para lidar com o login do usuário
@csrf_exempt
def login_view(request):
print(request.user.is_authenticated())
if request.POST:
email = request.POST.get('username')
password = request.POST.get('password')
user = authenticate(email=email, password=password)
if user is not None:
if user.is_active:
login(request, user)
return HttpResponseRedirect('/')
else:
return render(request, "login.html")
else:
return render(request, "login.html")
Quando me inscrevo, tudo parece bem, mas quando tento fazer login, isso simplesmente não me permite fazer login.
Então, quando eu verifiquei odjango admin
, foi o que eu encontrei
Username: tech1
Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.
Password:
Invalid password format or unknown hashing algorithm.
Raw passwords are not stored, so there is no way to see this user's password, but you can change the password using this form.
Não entendo muito bem por que a senha do usuário não é armazenada no momento da inscrição?
Eu procurei e descobri a partir desta respostausing User.objects.get_or_create () fornece formato de senha inválida no django? que o django criptografa a senha antes de armazenar e eu devo usar algo como
user, created = User.objects.get_or_create(username="testuser2")
user.set_password('123')
Mas não tenho certeza de onde colocar isso no meu código ou como isso ajuda? O que está acontecendo?