django休息框架创建用户密码 [英] django rest framework create user with password

查看:142
本文介绍了django休息框架创建用户密码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用django-rest-framework 3和django 1.8



我正在尝试使用django-rest-framework ModelViewSerializer创建一个用户。问题是DRF使用的默认的object.create方法将密码保留为纯文本。



问题是DRF serialzer create方法正在使用 objects.create querysets /#create 方法,而不是使用 objects.create_user 方法。



代码从 serializers.py 第775行

  instance = ModelClass.objects.create(** validated_data)

这是最好的解决方案?我可以重写serializer.create方法来使用objects.user_create而不是objects.create,但它不会像正确的解决方案。



其余代码:

 从django.contrib.auth.models导入用户
从rest_framework导入视图

class UserSerializer serializer.ModelSerializer):
class Meta:
model = User
fields =('username','email','password')
write_only_fields =('password',)


class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer = UserSerializer()


解决方案

您可以覆盖UserSerilizer中的创建

  class UserSerializer(serializers.ModelSerializer):
#....

def create(self,validated_data):
user = User.objects.create_用户(** validated_data)
返回用户

其他解决方案可以覆盖 perform_create 在ViewSet类中,或者您可以在您的视图集中编写自己的创建方法



$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $
$不要调用seriailzer.save()

更新: @freethebees评论后,覆盖 perform_create 也可以使用,所以这里是代码片段:

  class UserViewSet(viewsets.ModelViewSet,mixins.CreateModelMixin):
def perform_create(self,serializer):
#使用User.objects.create_user创建用户
pass

注意
此答案提供3种解决方案,选择您认为更适合您需求的解决方案和您项目的生态系统



注2
我个人更喜欢在 UserViewSet中覆盖创建 (第二个代码片段),因为您可以简单地返回您的自定义响应(例如,登录后返回用户个人资料)


Using django-rest-framework 3 and django 1.8

I am trying to create a user using django-rest-framework ModelViewSerializer. problem is that the default objects.create method used by DRF leave the password as plain text.

The problem is that DRF serialzer create method is using objects.create querysets/#create method instead of using objects.create_user method.

code from serializers.py line 775

instance = ModelClass.objects.create(**validated_data)

What is the best solution for this? i can override the serializer.create method to use objects.user_create instead of objects.create but it does not feel like the right solution.

rest of code:

from django.contrib.auth.models import User
from rest_framework import viewsets

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('username', 'email','password')
        write_only_fields = ('password',)


class UserViewSet(viewsets.ModelViewSet):   
    queryset = User.objects.all()
    serializer = UserSerializer()

解决方案

you can override create in UserSerilizer:

class UserSerializer(serializers.ModelSerializer):
    # ....

    def create(self, validated_data):
        user = User.objects.create_user(**validated_data)
        return user

other solutions can be overriding perform_create in ViewSet class or you can write your own create method in your viewset class

class UserViewSet(viewsets.ModelViewSet): 
    def create(self, request, format=None):
        # create user here
        # do not call seriailzer.save()

UPDATE: after @freethebees commented, overriding perform_create also works, so here is the code snippet:

class UserViewSet(viewsets.ModelViewSet, mixins.CreateModelMixin): 
    def perform_create(self, serializer):
        # use User.objects.create_user to create user
        pass

NOTE: this answer gives 3 solutions, choose the one you think it better fits your needs and your project's ecosystem

NOTE 2 I personally prefer overriding create in UserViewSet (second code snippet) because there you can simply return your custom Response (for example return user profile after login)

这篇关于django休息框架创建用户密码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆