无法在Django应用程序中验证用户身份

时间:2017-12-30 22:19:36

标签: python django http

我正在尝试使用Django建立一个网站,我有几个需要登录的视图。但是,我无法弄清楚如何验证用户。我对网络开发非常陌生(这是我的第一个项目),所以如果我不清楚,请询问后续问题。以下是一些可能提供上下文的代码:

摘自rushsite / rush / views.py:

from django.http import HttpResponseRedirect
from django.contrib.auth import authenticate, login
from django.contrib.auth.decorators import login_required

def login_user(request):
    if request.method == "POST":
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = authenticate(username=username, password=password)
        if user is not None:
            login(request, user)
            return HttpResponseRedirect('list')
        else:
            return render(request, "registration/login.html")
    else:
        return render(request, "registration/login.html")

我的login.html文件:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
</head>

<body>
    <div class="container">
        <div class="top">
            <h1 id="title" class="hidden"><span id="logo">Delta Sig<span> Recruitment</span></span></h1>
        </div>
        <div class="login-box animated fadeInUp">
            <div class="box-header">
                <h2>Log In</h2>
            </div>
            <form method="post">
                {% csrf_token %}
                <label for="username">Username</label>
                <br/>
                <input type="text" id="username">
                <br/>
                <label for="password">Password</label>
                <br/>
                <input type="password" id="password">
                <br/>
                <button type="submit">Sign In</button>
                <br/>
                <br/>
                {% if request.META.HTTP_REFERER == "http://127.0.0.1:8000/login/" %} Incorrect username or password. {% endif %}
            </form>
        </div>
    </div>
</body>

来自rushsite / rush / models.py的摘录:

from django.db import models
from django.contrib.auth.models import User
from django.core.validators import MaxValueValidator, MinValueValidator

class Brother(models.Model):

    user = models.OneToOneField(User, on_delete=models.CASCADE)
    first_name = models.CharField(max_length=64)
    last_name = models.CharField(max_length=64)

当我使用我知道有效的凭据点击我的表单上的提交时,用户=无,所以它只是将我重新定向回登录页面。我做错了什么?

1 个答案:

答案 0 :(得分:0)

由于您的登录视图没有做任何奇怪的事情,您应该使用django's pre-made authentication views。这可以避免在重新发明轮子时可能出现的正常问题。

它还包括一些额外的功能,例如使用django的表单,以及基于?next= GET arg成功登录时的重定向。

在这种情况下,您需要LoginView

我还建议查看[django的内置表单(https://docs.djangoproject.com/en/2.0/topics/forms/)。如果您 需要为此编写自己的视图,那么表单将有助于验证。他们可以simplify your template code,并会适当地显示验证错误。

使用LoginView自动生成的表单,模板中的<form>可以缩减为:

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
</form>