Django проблема с созданием пользователя, а затем войти в него - PullRequest
5 голосов
/ 17 февраля 2011

Привет всем вам, полезные люди там (и до свидания бесполезные люди: D).Я пытаюсь создать пользователя в django (1.2.4), а затем войти в него после сохранения.Моя проблема в том, что я получаю NotImplementedError и просматриваю трассировку, которую вызывает django.contrib.auth.models.AnonymousUser.Вот часть моего кода представления:

def signup(request):
    if request.method == 'POST': # If the form has been submitted...
        p = request.POST
        if not request.user.is_authenticated():
            form = UserForm(request.POST) # A form bound to the POST data
            if form.is_valid(): # All validation rules pass
                # Process the data in form.cleaned_data
                # ...
                form.save()
                user=authenticate(username=p['username'],password=p['password'])
                login(request,user)
                return HttpResponseRedirect('/') # Redirect after POST

Так что мне кажется, что он пытается войти в систему пользователя anymouse вместо того, кого я аутентифицирую, как я могу преодолеть это?

Спасибо PS. Пользователи создаются в базе данных, просто они не будут входить в систему, используя этот код.

Трассировка:

Среда:
Метод запроса:POST
URL запроса: http://localhost:8000/signup/
Версия Django: 1.2.4
Версия Python: 2.6.1
Установленные приложения:
['django.contrib.auth',
'django.contrib.contenttypes ',
' django.contrib.sessions ',
' django.contrib.sites ',
' django.contrib.messages ',
' django.contrib.admin ',
'django.contrib.admindocs',
'django_extensions',
'REDACTED_APPs', установленное промежуточное программное обеспечение: ('django.middleware.common.CommonMiddleware', 'django.middleware.locale.LocMalem'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware ',' django.contrib.sessions.middleware.SessionMiddleware ')

 Traceback:    
 File "/Library/Python/2.6/site-packages/django/core/handlers/base.py" in get_response    
   100.                     response = callback(request, *callback_args, **callback_kwargs)    
 File "REDACTED/views.py" in signup    
   19.                 login(request,user)    
 File "/Library/Python/2.6/site-packages/django/contrib/auth/__init__.py" in login    
   71.     user.save()    
 File "/Library/Python/2.6/site-packages/django/contrib/auth/models.py" in save    
   430.         raise NotImplementedError    

 Exception Type: NotImplementedError at /signup/    
 Exception Value:

Ответы [ 3 ]

6 голосов
/ 17 февраля 2011

Я думаю, что здесь происходит: authenticate возвращает None, поэтому login использует request.user (AnonymousUser).

Похоже, информация используется для созданияпользователь отличается от того, что вы передаете authenticate.Я бы дважды проверил, что пользователь сохраняется правильно (особенно пароль).

Редактировать : Из других ответов я вижу, что вы используете пользовательскую форму пользователя.Вы должны использовать django.contrib.auth.forms.UserCreationForm, метод save() установит пароль правильно.

Ниже не работает без ручной установки атрибута бэкэнда, больше проблем, чем стоит, оставлено для потомков

Самый простой способ - пропустить шаг аутентификации здесь (он не добавляет ничего важного)

user = UserForm.save()
login(request, user)
4 голосов
/ 17 февраля 2011

Создание пользователя с помощью form.save () не очень хороший способ ... Потому что, поскольку пароли сохраняются в хешированном формате, пароль устанавливается с помощью

user.passord = password

просто записывает нехэшированные данные в базу данных, и авторизация django не может их правильно проверить ... Вам нужно:

username = form.cleaned_data['username']
password = form.cleaned_data['password']

user = User.objects.create(username=username)
if password:
    user.set_password(password)
else:
    user.set_unusable_password()
user.save()
3 голосов
/ 17 февраля 2011

Не уверен, поможет ли это, но лучше всего извлечь поля формы, как показано ниже:

username = form.cleaned_data['username']
password = form.cleaned_data['password']
hashed_password = hashlib.md5(password).hexdigest()

user = authenticate(username=username, password=hashed_password)
if user:
    login(request, user)
    return HttpResponseRedirect('/')

От пользователей, которые были созданы с вашим текущим кодом, вы можете аутентифицировать их в системе?

Вот альтернативный способ создания и входа в систему с использованием формы входа и создания пользователя вручную:

# forms.py
from django import forms


class LoginForm(forms.Form):
    username = forms.CharField(max_length=20)
    password = forms.CharField(widget=forms.PasswordInput)


# views.py
import hashlib

username = form.cleaned_data['username']
password = form.cleaned_data['password']
hashed_password = hashlib.md5(password).hexdigest()

# assuming username is unique
User.objects.get_or_create(username=username, defaults={'password': hashed_password, 'is_active': True})

# If password doesn't work, try hashed_password next
user = authenticate(username=username, password=password)
if user:
    login(request, user)
    return HttpResponseRedirect('/')
...