为什么这个登录视图不起作用? (Django的)

时间:2011-12-17 15:17:06

标签: python django

我正在尝试使用Django的缓存系统创建登录视图。到目前为止,这是我的代码:

def login(request):
    if request.method == 'POST':

        form = LoginForm(request.POST)

        if form.is_valid():

            cd = form.cleaned_data
            username_exists = User.objects.filter(username=cd['username1'])
            if username_exists.count() != 0:
                username = username_exists[0]
                if username.password == cd['password']:
                    currentuser = cd['username1']
                    request.session['loggedin'+currentuser] = True
                    return HttpResponseRedirect('/user/%' % currentuser)
                else:
                    form = LoginForm(request.POST)
                    return render_to_response('login.html', {'form': form}, context_instance=RequestContext(request))
            else:
                form = LoginForm(request.POST)
                return render_to_response('login.html', {'form': form}, context_instance=RequestContext(request))
        else:
            form = LoginForm(request.POST)
            return render_to_response('login.html', {'form': form}, context_instance=RequestContext(request))
    else:
        form = LoginForm()
        return render_to_response('login.html', {'form': form}, context_instance=RequestContext(request))

我在数据库中使用的模型如下:

class User(models.Model):

    username = models.CharField(max_length=15)
    password = models.CharField(max_length=25)

这是表单“LoginForm”:

class LoginForm(forms.Form):

    username1 = forms.CharField(max_length=15, label="Username")
    password = forms.CharField(max_length=25, widget=forms.PasswordInput, label="Password")

以下是我正在使用的模板的一部分:

<h3>Login</h3>

<form action="" method="post">

{% csrf_token %}

<table>

{{ form.as_table }}

</table>

<input type="submit" value="Submit" style="margin-left:170px;margin-top:50px;">

</form>

视图只是刷新登录页面而不是重定向到用户页面,表格信息仍然填写(request.POST)。

我是Django的新手,所以如果我做的事情非常愚蠢,请提醒我。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

问题是你的最终成功条款涉及直接检查密码vs user.password这是一种单向哈希密码。因此,您可能会检查mypassword vs sha1$b322a$7e51a244d45f70d17b0bbca2b7369c1732b09c69

相反,使用django.contrib.auth.check_passwordauthenticate函数将为您进行密码比较,并将用户登录。您似乎正在进行某种手动登录,其中放置了会话标志将用户标记为已登录。您的所有用户也将是AnoymousUser个对象:)

阅读身份验证框架...... django.contrib.auth非常有用。

如果您使用内置函数,则可以使用更简单的快捷方式(如request.user.is_authenticated())来确定登录状态。

无论如何,在旁边讲道,手动检查密码:
https://docs.djangoproject.com/en/1.1/topics/auth/#manually-checking-a-user-s-password

要使用框架实际记录某人: https://docs.djangoproject.com/en/1.1/topics/auth/#django.contrib.auth.authenticate

你的代码的另一个问题是很难说出失败的原因 - 用户/你将无法获得有关他的登录失败的有用信息。

通常,最好将此信息放在表单清理方法中,以便您可以引发ValidationErrors,它会自动显示在您的表单中,而不会使多个if块混乱。

答案 1 :(得分:1)

你正在重新发明轮子。来自contrib.auth的用户模型已经检查了重复的用户名。

如果您想提供自己的表单和视图来创建用户,几乎所有您需要的代码都已经存在于contrib.auth中。