django开发之user模型用drf的序列化和两种api举例

作者:清一

类别:django   

发布时间:2019/09/02 11:35:20   更新时间:2019/09/02 11:35:20


本文讲述的环境:ubuntu、python3、virtualenv。

用户模型补充

在django中,已经有一个user的模型定义。如果开发用户模型,在这个模型上补充就好了。

原来的模型定义在:

\python3.5\site-packages\django\contrib\auth\models.py

 

建立一个user的应用app,在model.py文件补充。

方法如下:

from django.contrib.auth.models import AbstractUser



class User(AbstractUser):



    #username在AbstractUser中也是唯一的



    # 这里定义拓展的字段

    nickname = models.CharField('昵称', max_length=32, blank=True, null=True)

    tel = models.CharField(max_length=16, unique=True)



    class Meta:

        verbose_name="用户"

        verbose_name_plural=verbose_name



    # 方便admin中展示。

    def __str__(self):

        return self.username

 

用户模型序列化

建立一个drf的应用app,在serializers.py文件补充。

 

from rest_framework import serializers

from xxx.models import User



#超链接是一种很好的RESTful设计,但是有bug用不出来。

class UserSerializer(serializers.ModelSerializer):

    class Meta:

        #指定要序列化的模型。

        model = User

        #指定要序列化的字段。

        fields = ('id', 'username', 'password', 'nickname', 'email', 'tel')

        #全部展示

        #fields = "__all__"

        #指定不展示的字段

        #exclude = ('is_staff')

 

用户登录——APIView视图

class Login(APIView):



    #权限:任意用户。

    permission_classes = (permissions.AllowAny,)



    def post(self, request):

        try:

            username = request.data.get('username', -1)

            password = request.data.get('password', -1)

            tel = request.data.get('tel', -1)



            '''
对于封装的结构,可把他们打印出来,就知道怎么用了。

            logger.info(request)

            logger.info(type(request))

            logger.info(dir(request))

            logger.info(request.POST)

            logger.info(request.content_type)

            logger.info(request.data)

            '''



            #参数校验
xxxx


            #用户名和密码验证——这是django的标准功能

            user_obj = auth.authenticate(username=username, password=password)

            if not user_obj:

                return Response(set_return_data(-1, "用户名或密码错误。", {}))



            if not user_obj.is_active:

                return Response(set_return_data(-1, "用户没有激活。", {}))



            #token产生——这是Django OAuth Toolkit的功能

            #获取应用

            application_obj = Application.objects.get(name='your_app')

            result_list = create_token(username, password, application_obj.client_id, application_obj.client_secret)

            #logger.info(result_list)

            if (result_list[2]!=200):

                return Response(set_return_data(-1, "令牌创建错误。", {}))



            #auth.login主要是实现session的。这里不用session。

            

            #组织返回数据。

            user_data = {"id": user_obj.id,

                         "username": user_obj.username,

                         "nickname": user_obj.nickname,

                         "email": user_obj.email,

                         "tel": user_obj.tel}

            token_data = common_obj.json_to_dict(result_list[1])

            data = {'token': token_data, 'user': user_data}



            return Response(data)

        except Exception as err_instance:

            return Response(set_return_data(-1, traceback.format_exc(), 'exception'))

 

用户信息查询——通用视图

在drf的应用app,在views.py文件补充。

class RetrieveUser(generics.RetrieveAPIView):

    queryset = User.objects.all()

    serializer_class = UserSerializer

    #这里oath2负责认证,token给了READ_SCOPE 和 WRITE_SCOPE。get方法连TokenHasReadWriteScope都不需要。

    #permission_classes = [permissions.DjangoModelPermissionsOrAnonReadOnly, TokenHasReadWriteScope]

 


本文属于原创文章,未经许可,任何媒体、公司或个人不得刊发或转载。

本文网址:https://www.pyfield.com/blog/?id=26