2011-12-17 5 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)) 

私のモデルは以下の通りです:ここでは、フォーム、 "LoginForm" だ

class User(models.Model): 

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

:ここ

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'または作成したUserモデルのUserモデルですか? – czarchaic

答えて

1

あなたは車輪を再発明しています。 contrib.authのUserモデルはすでに重複したユーザー名をチェックしています。

ユーザーを作成するための独自のフォームとビューを提供する場合は、必要なコードのほとんどが既にcontrib.authに存在しています。

2

問題は、最終的な成功の句には、一方向ハッシュパスワードであるuser.passwordに対して直接パスワードを確認することが含まれます。だから、おそらくdjango.contrib.auth.check_passwordまたはあなたのために、パスワードの比較を行い、また、ユーザーがログに記録されますauthenticate機能を使用しています。あなたはどこセッションフラグ手動ログインのいくつかの種類をやっているように見える、mypassword代わり

sha1$b322a$7e51a244d45f70d17b0bbca2b7369c1732b09c69対をチェックしていますあなたのすべてのユーザーは 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ブロックで混乱することなく自動的にフォームに表示されます。

関連する問題