如何以编程方式使用django tastypie API创建或注册用户?

如何以编程方式使用django tastypie API创建或注册用户?,django,tastypie,Django,Tastypie,我下面的代码可以工作,它创建用户对象并保存,但不保存密码: class CreateUserResource(ModelResource): class Meta: allowed_methods = ['post'] object_class = User authentication = Authentication() authorization = Authorization() include_re

我下面的代码可以工作,它创建用户对象并保存,但不保存密码:

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
如果我在元字段中添加“password”,那么它确实会保存原始密码,但不会对其进行散列。我做错了什么


这就是我的工作原理:

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
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

创建用户时,您需要使用方法set\u password
user.set\u password(bundle.data.get('password'))
或使用用户对象的create\u user方法

user = User.objects.create_user(bundle.data.get('username'), bundle.data.get('email'), bundle.data.get('password'))
这样的事情对你来说是可行的:

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

我也遇到了同样的情况,发现这两种解决方案都很有用,但并不完整。在这两种情况下,我都可以创建用户名为空的用户。我不想有这样的泄漏,所以这里是我所做的

首先,我创建了一个验证表单:

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

我希望我的解决方案能够帮助其他开发人员。快乐编码

我试图使用django-tastypie==0.9.12的类似代码,但在缺少queryset和obj_-create的参数数量方面出现了错误。使用以下代码对我很有用:

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
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
一些测试代码可能是:

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": "youremail@example.com",
            "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))

如何在不首先创建用户的情况下进行身份验证?为了遵守REST原则,应该调用类UserResource而不是CreateUserResource。它仅用于创建的事实已在allowed_methods属性中说明,并且可以添加到您的类名上方的docstring中。@DavidW。如果你需要不同的身份验证方法来创建和列出,你会怎么做?@antonagestam在这个特殊的例子中,你必须制作两个资源不幸的是:(我写了一篇关于这个的博客文章,非常感谢你的这篇文章。这对创建用户注册资源非常有帮助。9.12