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

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()

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

Благодарность

0
dotty 5 Авг 2010 в 19:11

4 ответа

Лучший ответ

Почему бы не использовать представления Django auth по умолчанию?

5
Ghislain Leveque 5 Авг 2010 в 15:16

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

user = User.objects.get(username=username)
1
Mermoz 5 Авг 2010 в 16:04

Смотря на уровень управления, который вы хотите иметь, вы захотите использовать функции 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
Will Hardy 7 Авг 2010 в 07:41

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

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

0
Ali 6 Авг 2010 в 04:35