Кто-нибудь знает лучший способ написать эту функцию входа в Django - PullRequest
0 голосов
/ 05 августа 2010

Хей, мне было интересно, знает ли кто-нибудь лучший способ сделать это.

def login_user(request):
    username = request.POST.get('username')
    password = request.POST.get('password')

    user = User.objects.filter(username=username)

    if user:
        user = user[0]
        if user.password == generate_password(password):
            return HttpResponse("password fine")
        else:
            return HttpResponse("password incorrect")
    else:
        return HttpResponse("no user found by that username")

и функция generate_password просто

generate_password(string):
    return hashlib.sha224(str(string)).hexdigest()

Любые идеи были бы великолепны.

Спасибо

Ответы [ 4 ]

5 голосов
/ 05 августа 2010

Почему бы не использовать Django auth default views ?

1 голос
/ 05 августа 2010

Смотря на уровень управления, который вы хотите иметь, вы захотите использовать функции authenticate и, возможно, login в django.contrib.auth.Это основные функции для доступа к аутентификации.Я должен подчеркнуть, что вы действительно должны использовать их вместо того, чтобы находить пользователя и проверять хеш пароля вручную.Существует ряд причин, по которым:

  • они будут использовать любой аутентификационный бэкэнд, который вы или кто-то другой в будущем установили
  • ваша версия будет гораздо менее проверена, чем Django ис большей вероятностью откроет дыры в безопасности
  • это быстрее, короче, более гибко и более читабельно
  • Приложение аутентификации Django, вероятно, изменится в ближайшем будущем, придерживаясь authenticate, вы сможете перейти нановое приложение аутентификации, когда оно будет написано / зафиксировано / выпущено

Если вы хотите переписать способ обнаружения и аутентификации пользователя, напишите свой собственный Authenticate backend , который будетиспользоваться при вызове authentication (даже в чужом приложении, например, в админке).Это единственное место, где вы должны переписать аутентификацию в Django.

Следующие примеры взяты из Django auth docs .

1.Проверка пароля пользователя:

from django.contrib.auth import authenticate
user = authenticate(username='john', password='secret')
if user is not None:
    if user.is_active:
        print "You provided a correct username and password!"
    else:
        print "Your account has been disabled!"
else:
    print "Your username and password were incorrect."

2.Пользовательский бэкэнд аутентификации:

Вот бэкэнд, который использует тот же метод аутентификации, что и Django, который вы можете найти по адресу django.contrib.auth.backends.ModelBackend:

from django.contrib.auth.models import User

class MyBackend:
  def authenticate(self, username=None, password=None):
    try:
      user = User.objects.get(username=username)
      if user.check_password(password):
        return user
    except User.DoesNotExist:
      return None

  def get_user(self, user_id):
    try:
      return User.objects.get(pk=user_id)
    except User.DoesNotExist:
      return None
1 голос
/ 05 августа 2010

Единственное улучшение, которое я вижу, это использование get вместо фильтра (это сэкономит вам одну строку)

user = User.objects.get(username=username)
0 голосов
/ 06 августа 2010

Вам необходимо скачать django-регистрацию и пройти через код.Он управляет всем для вас, включая очистку кода.Ваш оригинальный код не будет обрабатывать пустые представления.

http://bitbucket.org/ubernostrum/django-registration/

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