простая система аутентификации в django не работает - PullRequest
0 голосов
/ 10 февраля 2010

Я пишу простую систему аутентификации для входа (и выхода) пользователей. Имя пользователя - это адрес электронной почты, который ищет поле электронной почты.

Я использую:

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/')

чтобы найти, существует ли пользователь, однако, если пользователь не найден, Django выдает ошибку:

User matching query does not exist.

Все, что я хочу сделать, это посмотреть, соответствует ли этот запрос результату. Как считать строки?

Ответы [ 2 ]

2 голосов
/ 10 февраля 2010

Используйте filter() вместо get().

1 голос
/ 10 февраля 2010

Я думаю, что это, вероятно, больше, чем вы хотите:

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/')

Лично я считаю, что это чище, чем метод Игнасио, но на самом деле это вопрос вкуса.

Наконец, последняя часть вашего вопроса («Как считать строки?»):

get только когда-либо возвращает объект и вызывает исключение, если ни один объект не соответствует критериям, которые вы ввели, или если несколько объектов соответствуют критериям. Чтобы получить количество объектов в QuerySet, вы можете просто позвонить len на него:

q = User.objects.filter(email = 'foo@bar.com')
print len(q)

Или позвоните count():

print User.objects.filter(email = 'foo@bar.com').count()

Первый метод (len) будет быстрее, если вы уже оценили QuerySet (так как он просто подсчитывает количество элементов в списке, эффективно); последнее (count()) будет быстрее, если вы не оценили QuerySet, поскольку Django будет выполнять SELECT COUNT(*) за кадром, и вы избегаете загрузки всех данных в память.

В качестве отступления - зачем вы направляете их на /home/, если адрес электронной почты не совпадает, и на /home/login/, если их учетные данные не работают? Я бы подумал, что для этих двух случаев имеет смысл перенаправить их в одно и то же место.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...