Django 2 - Login Authentication PROBLEMA: MultiValueDictKeyError por nome de usuário

votos
1

Eu estou tentando implementar pela primeira vez a autenticação para Django.

Estou criando a parte de login seguindo o guia oficial do Django 2. No entanto, estou tendo esse problema:

Exception Type: MultiValueDictKeyError Exception Value: 'username'

Eu criei um aplicativo chamado contas. Dentro dele, eu tenho o seguinte:

Nas contas / views.py:

from django.shortcuts import render, redirect
from django.contrib.auth.models import User
from django.contrib.auth import authenticate, login, logout    
def login(request):
      username = request.POST['username']
      password = request.POST['password']
      user = authenticate(request, username=username, password=password)
      if user is not None:
        return redirect('home')
      else:
        return render(request, accounts/login.html)

Em templates / accounts.html:

{% extends 'mysite/base.html' %}

{% block content %}

<h1>Login</h1>
<form method=POST action={% url 'login' %}>
{% csrf_token %}
Username:
<br>
<input type=text name=username />
<br>
Password:
<br />
<input type=password name=password />
<br>
<br>
<input class=btn btn-primary type=submit value=Sign Up! />
</form>

{% endblock %}

Em urls.py (do meu aplicativo contas não do projeto):

from django.urls import path, include
from . import views

urlpatterns = [
    path(signup/, views.signup, name=signup),
    path(login/, views.login, name=login),
    path(logout/, views.logout, name=logout),
]
Publicado 19/09/2018 em 13:33
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

Basta verificar o método de solicitação antes de fazer a autenticação como seguir

from django.shortcuts import render, redirect
from django.contrib.auth.models import User
from django.contrib.auth import authenticate, login, logout    
def login(request):
  if request.method == 'POST':
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(request, username=username, password=password)
    if user is not None:
      return redirect('home')
    else:
      return render(request, "accounts/login.html")
  else:
    return render(request, "accounts/login.html")
Respondeu 19/09/2018 em 13:49
fonte usuário

votos
1

def login(request):
    username = request.POST['username']
    ...

Você começa o erro porque a sua visão sempre tenta fazer com que usernamea partir dos dados do POST. No entanto, para o pedido GET inicial, request.POSTestará vazia.

Você não deve tentar escrever o seu próprio ponto de vista de login assim. Django vem com vista para autenticação . Você deve usá-los.

Respondeu 19/09/2018 em 13:39
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more