2010-02-10 3 views
0

사용자를 로그인 (로그 아웃)하는 간단한 인증 시스템을 쓰고 있습니다. 사용자 이름은 전자 메일 주소를 조회하는 전자 메일 주소입니다.django에서 간단한 인증 시스템이 작동하지 않습니다.

내가 사용 :

 
User matching query does not exist. 

내가하고 싶은 모든 경우에 볼 수 있습니다 : 사용자가 존재하는 경우

user = User.objects.get(email__exact=email) 
# if user obj exists 
if user: 
    # if authenticate 
    if authenticate(user, email, password): 
     # create session 
     request.session['user'] = user 
     # redir 
     return HttpResponseRedirect('/home/') 
    else: 
     return HttpResponseRedirect('/home/login/') 
# no user obj found? (no email found actually) 
else: 
    # redir 
    return HttpResponseRedirect('/home/') 

는 사용자가 장고를 찾을 수없는 그러나 경우, 찾을에서 오류가 발생합니다 해당 쿼리는 결과와 일치합니다. 행을 어떻게 계산합니까?

답변

1

나는 이것이 당신이 원하는 더 아마 생각합니다.

마지막으로, 질문의 마지막 부분은 ("어떻게 행을 계산합니까?") :

get는 오직 경우 개체를 반환하고, 어떤 물체는 전달 된 기준과 일치하지 않는 경우 예외가 발생하거나, 여러 개체가 기준과 일치합니다.

q = User.objects.filter(email = '[email protected]') 
print len(q) 

을 또는 count()를 호출하십시오 QuerySet의 개체 수를 얻으려면, 당신은 단지 그것을 len를 호출 할 수 있습니다 당신이 한 경우

print User.objects.filter(email = '[email protected]').count() 

전자의 방법 (len)가 빨리 될 것입니다 QuerySet (이미 목록의 항목 수를 계산하고 있기 때문에)을 이미 평가했습니다. Django가 SELECT COUNT(*)을 수행 할 것이기 때문에 후자 (count())는 QuerySet을 평가하지 않으면 빠를 것이며, 모든 데이터를 메모리에로드하는 것을 피할 수 있습니다.

전자 메일 주소가 일치하지 않으면 /home/으로 지정하고 자격 증명에 실패하면 /home/login/으로 지정하는 이유는 무엇입니까? 나는 그 두 가지 경우에 대해 같은 장소로 리디렉션하는 것이 더 합리적이라고 생각했을 것입니다.

+0

잊어 버린 : after User.DoesNotExist – dotty

+0

@dotty - 고마워, 난 항상 그랬어! –

+0

나도 그래, 네 해결책이 최선이야. 고맙습니다. – dotty

2

get() 대신 filter()을 사용하십시오.

try: 
    user = User.objects.get(email__exact=email) 
    if authenticate(user, email, password): 
     request.session['user'] = user 
     return HttpResponseRedirect('/home/') 
    else: 
     return HttpResponseRedirect('/home/login/') 
except User.DoesNotExist: # A user with the e-mail provided was not found 
    return HttpResponseRedirect('/home/') 

가 개인적으로 나는 그 이그나시오의 방법보다 깨끗하다고 ​​생각하지만 정말 취향의 문제 :

+0

D' oh! 무리 감사! – dotty

+0

대신 레코드 세트를 하나의 레코드로 제한하기 위해 user = User.objects.filter (email__exact = email) [0]을 사용했습니다. – dotty

+0

레코드가 존재하지 않으면 쿼리를 인덱싱하여 예외를 throw합니다. –

관련 문제