首页 文章

Django REST框架 - 注册/验证新用户的正确方法是什么?

提问于
浏览
0

我最近才开始使用Django REST框架 . 我想创建一个用户 . 之前(没有Django REST框架)我曾经使用以下逻辑创建用户(使用django.contrib.auth.models中的用户模型):

步骤1)创建一个用户注册表单(-1-验证当用户在注册时最初输入他的密码时,password1和'confirm password'/ password2匹配并且-2-验证用户名只包含字母,数字下划线和-3-验证用户名尚未注册/采用):

class RegistrationForm(forms.Form):

    username = forms.CharField(label='Username', max_length=30)
    email = forms.EmailField(label='Email')
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput()) 
    password2 = forms.CharField(label='Confirm Password', widget=forms.PasswordInput()) 

    def clean_password2(self):
    if 'password1' in self.cleaned_data:
        password1 = self.cleaned_data['password1']
        password2 = self.cleaned_data['password2']
        if password1 == password2:
        return password2
    raise forms.ValidationError('Passwords do not match.')

    def clean_username(self):
    username = self.cleaned_data['username']
    if not re.search(r'^\w+$', username): #checks if all the characters in username are in the regex. If they aren't, it returns None
        raise forms.ValidationError('Username can only contain alphanumeric characters and the underscore.')
    try:
        User.objects.get(username=username) #this raises an ObjectDoesNotExist exception if it doesn't find a user with that username
    except ObjectDoesNotExist:
        return username #if username doesn't exist, this is good. We can create the username
    raise forms.ValidationError('Username is already taken.')

步骤2)创建一个View,在提交时处理此表单:

if request.method == 'POST':
    form = RegistrationForm(request.POST)

    if form.is_valid():
        user = User.objects.create_user(
        username=form.cleaned_data['username'],
        password=form.cleaned_data['password1'],
        email=form.cleaned_data['email']
    )

根据我的理解,Django REST框架只有在我返回用户对象时才会发挥作用 . 所以假设我想将User作为JSON对象返回,我会像这样使用Django REST框架:我的serializers.py文件:

class UserSerializer(serializers.ModelSerializer):

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

以及我处理返回用户对象的视图:

if request.method == 'GET':
    users = User.objects.all()
    serializer = UserSerializer(users, many=True)
    return Response(serializer.data)

这是正确的做法吗?因为这个SO帖子:Django Rest Framework User Registrations with extra fields似乎以不同的方式创建用户:

serialized = UserSerializer(data=request.DATA)
    if serialized.is_valid():
        user = User.objects.create_user(
            email = serialized.init_data['email'],

而这篇文章:django rest framework user registration也以不同于我上面的方式创建用户 .

1 回答

  • 1

    因此,您构建的内容和链接的内容似乎正在解决不同的问题 . 您正在做的是序列化API的用户数据 . 如果我使用你的api,我可以看到用户的用户名 . 但是你的链接是允许人们使用他们的API创建新用户 . 那你想做什么?

    放置它的最好方法是你做一个“GET”请求,他们正在使用“POST”请求 .

相关问题