Django问题与创建用户然后登录他们
你好所有你有帮助的人在那里(和再见没有帮助的人:D)。我试图在django(1.2.4)中创建一个用户,然后在保存它们之后登录它们。我的问题是我得到NotImplementedError并看着它被django.contrib.auth.models.AnonymousUser引发的追踪。下面是我的看法代码的一部分:Django问题与创建用户然后登录他们
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,而不是一个我认证,我如何克服这个问题?
谢谢 P.S.用户正在数据库中创建,它只是不会使用此代码登录它们。
回溯:
环境:
请求方法: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.LocaleMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware' , 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.cont rib.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:
我认为正在发生的这里authenticate
正在恢复None
,因此login
使用request.user
(一AnonymousUser
)。
看起来用于创建用户的信息与您传递给authenticate
的信息不同。我会仔细检查用户是否正确保存(特别是密码)。
编辑:从其他答案我看你使用自定义用户的形式。您应该使用django.contrib.auth.forms.UserCreationForm
,它的save()
方法将正确设置密码。
以下无需手动设置后端属性不工作,更多的麻烦比它的价值,为后人留下了
的容易出是在这里跳过身份验证步骤(它不添加任何重要的东西)
user = UserForm.save()
login(request, user)
不知道这是否会帮助,但它是最好的提取表单字段类似如下:
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('/')
创建用户与form.save()不是一个好办法...因为,因为密码是保存在一个散列格式,pasword使用
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()
请发布追踪! – Wogan 2011-02-17 03:43:00