2011-02-17 63 views
5

你好所有你有幫助的人在那裏(和再見沒有幫助的人: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: 
+0

請發佈追蹤! – Wogan 2011-02-17 03:43:00

回答

6

我認爲正在發生的這裏authenticate正在恢復None,因此login使用request.user(一AnonymousUser)。

看起來用於創建用戶的信息與您傳遞給authenticate的信息不同。我會仔細檢查用戶是否正確保存(特別是密碼)。

編輯:從其他答案我看你使用自定義用戶的形式。您應該使用django.contrib.auth.forms.UserCreationForm,它的save()方法將正確設置密碼。

以下無需手動設置後端屬性不工作,更多的麻煩比它的價值,爲後人留下了

的容易出是在這裏跳過身份驗證步驟(它不添加任何重要的東西)

user = UserForm.save() 
login(request, user) 
+0

部分正確,它返回None。我嘗試了你的解決方案,因爲沒有進行身份驗證,所以根本無法根據文檔「首先調用身份驗證()」獲得一些後端信息。 在手動登錄用戶時,必須先調用authenticate你調用login()。authenticate()在用戶身上設置一個屬性,指出哪個認證後端成功認證了該用戶(詳情請參閱後端文檔),並且稍後在登錄過程中需要此信息。 – UserZer0 2011-02-17 04:57:12

+0

修改了我的答案一點。 – Wogan 2011-02-17 12:53:34

3

不知道這是否會幫助,但它是最好的提取表單字段類似如下:

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('/') 
3

創建用戶與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() 
相關問題