如何以编程方式使用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