2013-07-05 3 views
0

Я новичок в Django, и я пытаюсь создать простое приложение для регистрации/входа в систему. Для регистрации Я использую пользовательский UserCreationForm:UserCreationForm, hash password и authenticate()

def registration(request): 
    if request.method == 'POST': 
     form = UserCreationForm(request.POST) 
     if form.is_valid(): 
      new_user = form.save() 
      messages.info(request, "You've successfully registered") 
      return HttpResponseRedirect('/') 
    else: 
     form = UserCreationForm 
    return render(request, 'accounts/registration.html', {'form': form}) 

И это хорошо работает. Но при входе в систему я столкнулся с трудностями. У меня есть AttributeError в/accounts/login. Пользовательский объект не имеет атрибута 'backend'. Кажется, что authenticate() возвращает объект None, даже если логин/пароль правильный.

def login(request): 
    if request.method == "POST": 
     form = LoginForm(request.POST) 
     if form.is_valid(): 
      userData = form.cleaned_data 
      user = authenticate(username=userData['username'],password=userData['password']) 
      auth_login(request, user) 
      messages.info(request, "You're successfully logged in") 
      return HttpResponseRedirect('/') 
     else: 
      messages.info(request, 'Invalid username or password') 
      return HttpResponseRedirect('/accounts/login') 
    else: 
     form = LoginForm() 
    return render(request, 'accounts/login.html', {'form': form} 

Я думаю, дело в том, что пароль сохранен в БД в хэшированном форме, и поэтому USERDATA [ «пароль»] не совпадает с значением в дБ для того же пользователя.

Какой лучший способ исправить эту ошибку?

ошибка трассировки

Internal Server Error: /accounts/login 
Traceback (most recent call last): 
    File "C:\Python27\myproject\djcode\first_venv\venv\lib\site-packages\django\core\handlers\base.py" 
, line 115, in get_response 
    response = callback(request, *callback_args, **callback_kwargs) 
    File "C:\Python27\myproject\djcode\first_venv\myownproject\accounts\views.py", line 36, in login 
    auth_login(request, user) 
    File "C:\Python27\myproject\djcode\first_venv\venv\lib\site-packages\django\contrib\auth\__init__. 
py", line 92, in login 
    request.session[BACKEND_SESSION_KEY] = user.backend 
    File "C:\Python27\myproject\djcode\first_venv\venv\lib\site-packages\django\utils\functional.py", 
line 203, in inner 
    return func(self._wrapped, *args) 
AttributeError: 'User' object has no attribute 'backend' 
+0

Не могли бы вы показать код UserCreationForm, может быть сохранить пароль сразу в базу данных. если вы user.set_password (<значение пароля>), то он будет кодировать значение пароля django, а затем во время аутентификации он проверит его правильно. –

+0

И ошибка трассировки – lalo

+0

Я использую default UserCreationForm http://docs.nullpobug.com/django/trunk/django.contrib.auth.forms.UserCreationForm-class.html и не меняю его, поэтому в forms.py I имеют только LoginForm (имя пользователя/пароль). Может быть, я должен как-то исправить это? Добавить ошибку трассировки – Leval

ответ

0

попробовать это в вашем коде

user = authenticate(username=userData['username'],password=userData['password']) 
if user: 
    user.backend = 'django.contrib.auth.backends.ModelBackend' 
    auth_login(request, user) 
else: 
    print "invalid login" 
+0

Недопустимый логин [05/Jul/2013 16:51:20] "POST/accounts/login HTTP/1.1" 200 631 – Leval

+0

не имеет ничего общего с хэшами, пока вы используете User.objects. create_user в UserCreationForm. можете ли вы разместить свой LoginForm и UserCreationForm .., если вам надоело это делать, просто используйте этот https://bitbucket.org/ubernostrum/django-registration/ – boltsfrombluesky

+0

класс LoginForm (forms.Form): \t username = forms .CharField (max_length = 30) \t пароль = forms.CharField (виджет = forms.PasswordInput) LoginForm проста, и по умолчанию UserCreationForm (как это http://docs.nullpobug.com/django/trunk/django.contrib .auth.forms.UserCreationForm-class.html) Спасибо за совет, я пытаюсь изучить работу с django, создав базовые приложения. В противном случае я никогда не узнаю его :) – Leval

Смежные вопросы