我如何访问请求参数以验证用户身份

时间:2019-06-24 21:59:39

标签: python django django-authentication

我想为我的应用程序编写一个简单的登录表单。这只是一种简单的形式,它通过发布请求将数据发送到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 个答案:

答案 0 :(得分:1)

HTML表单使用name=... [html.com]属性创建键值对,而不是 id=... 的键值对。因此,您应该按照文档中的说明指定名称:

  

指定输入元素的名称。提交表单时,每个输入元素的名称和值都包含在HTTP请求中

因此,您应该添加name属性,例如:

<form method="POST" action="/login/">{% csrf_token %}
<div class="form-group">
<label for="ID">User</label>
<input name="ID" type="text" class="form-control" id="ID" aria-describedby="User" placeholder="Username">
</div>
<div class="form-group">
<label for="password">Passwort</label>
<input name="password" 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="..."属性,但是在提交表单时该属性不起作用。