Django 2 - ПРОБЛЕМА аутентификации входа: MultiValueDictKeyError для имени пользователя - PullRequest
0 голосов
/ 19 сентября 2018

Я впервые пытаюсь реализовать аутентификацию для Django.

Я создаю часть для входа в систему, следуя официальному руководству Django 2. Однако у меня возникла эта проблема:

Exception Type: MultiValueDictKeyError Exception Value: 'username'

Я создал приложение под названием «Аккаунты».Внутри него у меня есть следующее:

В accounts / 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")

В шаблонах / 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 %}

В URL.py (моего "аккаунта" приложения, а не проекта):

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"),
]

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Просто проверьте метод запроса перед выполнением аутентификации, как показано ниже

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")
0 голосов
/ 19 сентября 2018
def login(request):
    username = request.POST['username']
    ...

Вы получаете ошибку, потому что ваш взгляд всегда пытается получить username из данных POST.Однако для начального запроса GET request.POST будет пустым.

Вы не должны пытаться написать свой собственный вид входа в систему, подобный этому.Django поставляется с аутентификационными представлениями .Вы должны использовать их.

...