2011-12-17 54 views
0

我试图用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很陌生,所以如果我正在做一些非常愚蠢的事情,请提醒我。

感谢您的帮助。

+0

这是'contrib.auth'中的用户模型还是您创建的用户模型? – czarchaic 2011-12-17 16:06:43

回答

1

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

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

2

问题是您的最终成功条款涉及直接检查密码与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块混乱。