2012-01-17 34 views
18

Mã của tôi dưới đây kinda hoạt động, nó tạo ra các đối tượng người dùng và tiết kiệm nhưng nó không lưu mật khẩu:Làm cách nào để tạo hoặc đăng ký Người dùng bằng cách sử dụng API django-ngonpie theo lập trình?

class CreateUserResource(ModelResource): 
    class Meta: 
     allowed_methods = ['post'] 
     object_class = User 
     authentication = Authentication() 
     authorization = Authorization() 
     include_resource_uri = False 
     fields = ['username'] 

    def obj_create(self, bundle, request=None, **kwargs): 
     try: 
      bundle = super(CreateUserResource, self).obj_create(bundle, request, **kwargs) 
     except IntegrityError: 
      raise BadRequest('That username already exists') 
     return bundle 

Nếu tôi thêm 'mật khẩu' đến các lĩnh vực Meta sau đó nó lưu mật khẩu thô nhưng không băm nó. Tôi đang làm gì sai?


Vì vậy, đây là những gì làm việc cho tôi:

def obj_create(self, bundle, request=None, **kwargs): 
    username, password = bundle.data['username'], bundle.data['password'] 
    try: 
     bundle.obj = User.objects.create_user(username, '', password) 
    except IntegrityError: 
     raise BadRequest('That username already exists') 
    return bundle 
+1

Làm thế nào bạn thực hiện chứng thực mà không cần tạo người dùng đầu tiên? – Burak

+0

Bạn nên gọi lớp UserResource của bạn thay vì CreateUserResource để tôn trọng nguyên tắc REST. Thực tế là nó được sử dụng để tạo ra chỉ đã được nói trong thuộc tính allowed_methods, và có thể được thêm vào một docstring phía trên classname của bạn. –

+0

@DavidW. Bạn sẽ làm điều đó như thế nào nếu bạn cần các phương thức xác thực khác nhau để tạo và liệt kê? – antonagestam

Trả lời

21

Khi tạo một người dùng mà bạn cần hoặc phương pháp sử dụng set_password user.set_password(bundle.data.get('password')) hoặc sử dụng một phương pháp create_user của đối tượng người dùng.

user = User.objects.create_user(bundle.data.get('username'), bundle.data.get('email'), bundle.data.get('password')) 

Vì vậy, một cái gì đó như thế này sẽ làm việc cho bạn:

def obj_create(self, bundle, request=None, **kwargs): 
    try: 
     bundle = super(CreateUserResource, self).obj_create(bundle, request, **kwargs) 
     bundle.obj.set_password(bundle.data.get('password')) 
     bundle.obj.save() 
    except IntegrityError: 
     raise BadRequest('That username already exists') 
    return bundle 
+0

Tôi đã viết một bài đăng blog trên http://www.psjinx.com/programming/2013/06/07/so-you-want-to này -create-users-using-djangotastypie/ – pankaj28843

4

tôi ở trong tình trạng tương tự và thấy cả hai giải pháp hữu ích, nhưng không hoàn toàn. Trong cả hai, tôi có thể tạo người dùng với tên người dùng trống. Tôi không muốn bị rò rỉ như vậy, đây là những gì tôi đã làm.

Trước tiên, tôi đã tạo ra một hình thức xác nhận:

from django import forms 
from django.forms import ModelForm 
from django.contrib.auth.models import User 

class UserForm(forms.ModelForm): 
def __init__(self, *args, **kwargs): 
    super(UserForm, self).__init__(*args, **kwargs) 

    self.fields['username'].error_messages = {'required': "Please enter username"} 
    self.fields['username'].max_length = 30 
    self.fields['password'].error_messages = {'required': 'Please enter password'} 
    self.fields['password'].max_length = 30 

    self.fields['email'].required = False 

def clean_username(self): 
    username = self.cleaned_data['username'] 
    if len(username) < 4: 
     raise forms.ValidationError("Username has to be longer than 4 characters") 
    return username 

def clean_password(self): 
    password = self.cleaned_data['password'] 
    if len(password) < 5: 
     raise forms.ValidationError("Password has to be longer than 5 characters") 
    return password 

class Meta: 
    model = User 
    fields = ('username', 'email', 'password') 

Sau đó, bên trong UserResource

validation = FormValidation(form_class=UserForm) 

def obj_create(self, bundle, request=None, **kwargs): 
    bundle = super(UserResource, self).obj_create(bundle, request, **kwargs) 
    bundle.obj.set_password(bundle.data.get('password')) 
    bundle.obj.save() 

    return bundle 

tôi hy vọng giải pháp của tôi có thể giúp các nhà phát triển đồng. Chúc mừng mã hóa!

2

Tôi đã cố gắng sử dụng mã tương tự với django-tastypie == 0.9.12 và gặp lỗi liên quan đến thiếu queryset và số đối số cho obj_create. Sử dụng đoạn mã sau làm việc cho tôi:

from django.contrib.auth.models import User 
from django.db import IntegrityError 

from tastypie.resources import ModelResource 
from tastypie.authorization import Authorization 
from tastypie.authentication import Authentication 
from tastypie import fields 
from tastypie.exceptions import BadRequest 

class UserSignUpResource(ModelResource): 
    class Meta: 
     object_class = User 
     resource_name = 'register' 
     fields = ['username', 'first_name', 'last_name', 'email'] 
     allowed_methods = ['post'] 
     include_resource_uri = False 
     authentication = Authentication() 
     authorization = Authorization() 
     queryset = User.objects.all() 

    def obj_create(self, bundle, request=None, **kwargs): 
     try: 
      bundle = super(UserSignUpResource, self).obj_create(bundle) 
      bundle.obj.set_password(bundle.data.get('password')) 
      bundle.obj.save() 
     except IntegrityError: 
      raise BadRequest('Username already exists') 

     return bundle 

Một số mã kiểm tra sẽ là:

from django.contrib.auth.models import User 
from django.contrib.auth.hashers import check_password 

from tastypie.test import ResourceTestCase 

class UserSignUpResourceTest(ResourceTestCase): 
    def test_post_list(self): 
     post_arguments = { 
      "email": "[email protected]", 
      "first_name": "John", 
      "last_name": "Doe", 
      "username": "test-user", 
      "password": "idiotic-pwd" 
     } 
     # Check how many are there 
     self.assertEqual(User.objects.count(), 0) 
     self.assertHttpCreated(self.api_client.post('/api/register/', 
     format='json', data=post_arguments)) 
     # Check how many are there. Should be one more 
     self.assertEqual(User.objects.count(), 1) 
     # Check attributes got saved correctly 
     user = User.objects.get(username='test-user') 
     for atr in post_arguments: 
      if atr == 'password': 
       check_password(post_arguments[atr], getattr(user, atr)) 
      else: 
       self.assertEqual(post_arguments[atr], getattr(user, atr)) 
+0

Cảm ơn bạn rất nhiều vì bài đăng này. Rất hữu ích trong việc tạo tài nguyên đăng ký người dùng được tạo cho .9.12 –

Các vấn đề liên quan