如何访问请求参数以对用户进行身份验证

How do I access the request params in order to authenticate an user

我想为我的应用程序编写一个简单的登录表单。它只是一个简单的表单,它通过 post 请求向 django 服务器发送数据。 对于身份验证,我必须访问 post 请求数据,如 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'

你能帮帮我吗?

HTML 表单使用 name=... [html.com] 属性创建 key-value 对,不是 id=...。所以你应该指定名称,正如文档中指定的那样:

Specifies the name of an input element. The name and value of each input element are included in the HTTP request when the form is submitted.

因此您应该添加 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="..." 属性,但在您提交表单时它不起作用。