Как мне получить доступ к параметрам запроса для аутентификации пользователя? - PullRequest
1 голос
/ 25 июня 2019

Я хотел бы написать простую форму для входа в мое приложение.Это простая форма, которая отправляет данные через почтовый запрос на сервер django.Для аутентификации мне нужно получить доступ к данным пост-запроса, как упомянуто в документации django, но это не работает должным образом.

Это моя HTML-форма:

<form method="POST" action="/login/">{% csrf_token %}
<div class="form-group">
<label for="ID">User</label>
<input type="text" class="form-control" id="ID" aria-describedby="User" placeholder="Username">
</div>
<div class="form-group">
<label for="password">Passwort</label>
<input type="password" class="form-control" id="password" laceholder="Passwort">
</div>
<button type="submit" class="btn btn-primary">Einloggen</button>
</form>

Это мой код Django:

def get_access(request):
    if request.method == 'POST':
        username = request.POST['ID']
        password = request.POST['password']
        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)

Я получаю эту ошибку:

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/login/

Django Version: 2.1.7
Python Version: 3.7.3
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'App',
 'rest_framework',
 'rest_framework.authtoken']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "C:\Users\felix\DEV\my_env\lib\site-packages\django\utils\datastructures.py" in __getitem__
  77.             list_ = super().__getitem__(key)

During handling of the above exception ('ID'), another exception occurred:

File "C:\Users\felix\DEV\my_env\lib\site-packages\django\core\handlers\exception.py" in inner
  34.             response = get_response(request)

File "C:\Users\felix\DEV\my_env\lib\site-packages\django\core\handlers\base.py" in _get_response
  126.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\felix\DEV\my_env\lib\site-packages\django\core\handlers\base.py" in _get_response
  124.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\felix\DEV\my_env\Animoo\App\views.py" in get_access
  163.         username = request.POST['ID']

File "C:\Users\felix\DEV\my_env\lib\site-packages\django\utils\datastructures.py" in __getitem__
  79.             raise MultiValueDictKeyError(key)

Exception Type: MultiValueDictKeyError at /login/
Exception Value: 'ID'

Вы можете мне помочь?

1 Ответ

1 голос
/ 25 июня 2019

HTML-форма использует атрибут name=... [html.com] для создания пар ключ-значение, не id=....Таким образом, вы должны указать имя, как указано в документации:

Указывает имя элемента ввода.Имя и значение каждого входного элемента включены в HTTP-запрос при отправке формы.

, таким образом, вы должны добавить name атрибутов, таких как:

<form method="POST" action="/login/">{% csrf_token %}
<div class="form-group">
<label for="ID">User</label>
<input <b>name="ID"</b> type="text" class="form-control" id="ID" aria-describedby="User" placeholder="Username">
</div>
<div class="form-group">
<label for="password">Passwort</label>
<input <b>name="password"</b> type="password" class="form-control" id="password" laceholder="Passwort">
</div>
<button type="submit" class="btn btn-primary">Einloggen</button>
</form>

id=... используется для идентификации объектов в DOM и, например, использования JavaScript и т. Д. Для динамического изменения содержимого HTML.Таким образом, вы все равно можете сохранить атрибут id="...", но он не работает при отправке формы.

...