2011-12-17 3 views
0

장고의 캐시 시스템으로 로그인보기를 만들려고합니다. 여기 내 코드는 지금까지의 :왜이 로그인보기가 작동하지 않습니까? (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

답변

1

당신은 바퀴를 다시 발명하고 있습니다. contrib.auth의 User 모델은 이미 중복 된 사용자 이름을 확인합니다.

사용자 생성을 위해 자신 만의 양식과보기를 제공하려는 경우 필요한 거의 모든 코드가 이미 contrib.auth에 있습니다.

2

문제는 최종 성공 절에 암호를 직접 확인하는 것이 포함됩니다 (단방향 해시 암호 인 user.password). 그래서 당신은 가능성이 대신 django.contrib.auth.check_password를 사용하거나 암호 비교를하고도에서 사용자를 로그합니다 authenticate 기능. 당신은 어디 세션 플래그 매뉴얼 로그인 어떤 종류의 일을 할 것 같다 sha1$b322a$7e51a244d45f70d17b0bbca2b7369c1732b09c69

mypassword을 확인하고 사용자가 로그인 한 것으로 표시됩니다. 모든 사용자는 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 블록으로 어수선하게 나타나지 않고 양식에 자동으로 표시됩니다.

관련 문제