2011-02-17 28 views
5

Merhaba tüm yardımsever insanlara merhaba (ve hoşçakal hiç yardımcı olmayan insanlar: D). Ben django (1.2.4) bir kullanıcı oluşturmaya çalışıyorum ve sonra onları kaydettikten sonra oturum açın. Sorunum, NotImplementedError alıyorum ve tracback'e bakarak django.contrib.auth.models.AnonymousUser tarafından yükseltiliyor. Bunun üstesinden nasıl,Kullanıcı yaratırken Django ile ilgili daha fazla bilgi edinin

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 

Yani Bir anymouse kullanıcının yerine ben doğrulama ediyorum birinde giriş yapmaya çalışıyor bana bakıyor: İşte benim bakış kod parçası mı?

Teşekkürler P.S. Kullanıcılar veritabanında oluşturuluyor, sadece bu kodu kullanarak giriş yapmıyor.

traceback:

Çevre:
Talebi Yöntem: POST
URL isteği: http://localhost:8000/signup/
Django Versiyon: 1.2.4
Python Versiyon: 2.6.1
Yüklü Uygulamalar:
[ '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', Yüklü Middleware: ('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')

Burada oluyor authenticate None dönüyor düşünüyorum ne
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

Lütfen geri bildirim gönderin! – Wogan

cevap

6

nedenle loginrequest.user (bir kullanıyor AnonymousUser).

Kullanıcıyı oluşturmak için kullanılan bilgiler, authenticate'a geçirdiğiniz şeyden farklıdır. Kullanıcının doğru şekilde kaydedilip kaydedilmediğini (özellikle şifre) iki kez kontrol ederim.

Düzenleme: Ben özel bir kullanıcı formu kullandığını görmek diğer yanıtlarından. django.contrib.auth.forms.UserCreationForm kullanmalısınız, save() metodu, şifreyi doğru bir şekilde ayarlayacaktır.Aşağıda

elle arka uç özelliğini ayarlamadan çalışmaz, bu değer daha fazla bela,

dışarı kolay (önemli şey katmıyor burada kimlik doğrulaması adımı atlamak için kuşaklar için sol)

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

Kısmen, geri dönüyor Yok. Çözümünüzü denedim ve işe yaramıyor çünkü kimlik doğrulaması yapılmadan dokümanlar tarafından görünüşe göre bazı arka uç bilgileri almıyorsunuz "İlk olarak adlandırılıyor kimlik doğrulaması() Bir kullanıcı giriş yaptığınızda, önce kimliği() çağırmanız gerekir login(). authenticate(), kullanıcının kimlik doğrulamasının başarılı bir şekilde o kimliği doğruladığını belirten Kullanıcıdaki bir özniteliği ayarlar (ayrıntılar için arka plan belgelerine bakın) ve bu bilgiler giriş sırasında daha sonra gerekir. – UserZer0

+0

Cevabımı biraz revize etti. – Wogan

+0

Teşekkürler, diğer cevaplar iyi ama UserCreationForm kesinlikle gitmek için bir yoldur. – UserZer0

3

o yardımcı olacaktır emin değilim ancak aşağıdaki gibi form alanları ayıklamak için en iyisi:

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

Geçerli kodunuzla oluşturulmuş kullanıcılardan, onları sisteme doğrulayabilir misiniz?

Burada giriş formunu kullanarak ve elle kullanıcı oluşturarak alternatif oluşturmak için bir yol ve giriş var:

# 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('/') 
+0

Form.cleaned_data işlemini denedim, aynı orijinal hatayı al. Yeni oluşturulan kullanıcının kimliğini doğrulamak için başka yollarla detaylandırır mısınız? Ben bilmek istediğim buydu. – UserZer0

+0

Bu kullanıcıları yaratıyor ve doğrulıyorsunuz ancak kod başarısız oluyor. Yeni kullanıcının kullanıcı adı ve şifresi ile siteye veya yöneticiye kimlik doğrulaması yapabilir misiniz? –

+0

TEŞEKKÜRLER, şimdi bir yere varıyoruz! Sadece indead'in yaratıldıklarını, ancak arka uçta oturum açmaya çalıştıklarını görmeyi kontrol ettim, orada da kimlik doğrulaması olmadığını gördüm. Bu yüzden arka taraftaki şifreye bakıyorum ve bunları otomatik olarak şifrelemediğini anlıyorum, muhtemelen buradaki sorun. Kullanıcı formunu kaydetmeden önce şifreyi nasıl şifrelemeliyim. Bu noktada, UserForm'un bir model formu olduğunu, varsayılan bir tane varsa, ona erişmek için neye ihtiyacım olduğuna inanıyorum. – UserZer0

3

form.save() iyi yol değildir sahip bir kullanıcı oluşturuluyor ... şifreler bir karma biçimde kaydedilmiş olduğundan, şirfe

user.passord = password 

kullanılarak belirlenen Çünkü sadece İhtiyacın olduğunu ... doğru kontrol edemez veritabanı ve django auth için unhashed verileri yazıyor:

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() 
İlgili konular