2011-12-17 31 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塊混亂。