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

Elv*_* R. 18 django tastypie

我的代码下面有点工作,它创建User对象并保存,但它不保存密码:

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
Run Code Online (Sandbox Code Playgroud)

如果我将"密码"添加到元字段,那么它会保存原始密码但不会对其进行散列.我究竟做错了什么?


所以这对我有用:

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
Run Code Online (Sandbox Code Playgroud)

Ald*_*und 21

创建用户时,您需要使用方法set_password user.set_password(bundle.data.get('password'))或使用User对象的create_user方法.

user = User.objects.create_user(bundle.data.get('username'), bundle.data.get('email'), bundle.data.get('password'))
Run Code Online (Sandbox Code Playgroud)

所以这样的事情对你有用:

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
Run Code Online (Sandbox Code Playgroud)


Lai*_*iux 5

我当时处在相同的情况下,发现这两种解决方案都很有帮助,但并不完整。在这两种情况下,我都可以使用空用户名创建用户。我不想有这样的泄漏,所以这就是我所做的。

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

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')
Run Code Online (Sandbox Code Playgroud)

然后,在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
Run Code Online (Sandbox Code Playgroud)

我希望我的解决方案可以对其他开发人员有所帮助。编码愉快!