• 【Vue+DRF 生鲜电商】用户个人中心(六)


    1. docs 文档

    drf 的 api 文档优点:

    • 自动生成
    • 支持交互
    • 支持多语言片段(js、Python、shell

    1、MxShop/urls.py

    # drf 文档,title:文档标题
    path('docs', include_docs_urls(title='hubery')),
    

    2、文档注释:

    class UserAddressViewSet(viewsets.GenericViewSet, mixins.CreateModelMixin, mixins.ListModelMixin,
                             mixins.DestroyModelMixin, mixins.UpdateModelMixin):
        """
        文档注释:
        用户收件地址:新增地址(CreateModelMixin)、删除地址(DestroyModelMixin)
        、所有地址(ListModelMixin)、更新地址(UpdateModelMixin)
        """
    

    访问地址:http://127.0.0.1:8000/docs(最后不要加 /

    踩坑:docs 文档访问出现:AttributeError: 'AutoSchema' object has no attribute 'get_link'

    配置 settings

    REST_FRAMEWORK = {
        # docs 文档相关
        "DEFAULT_SCHEMA_CLASS": "rest_framework.schemas.AutoSchema"
    }
    

    2. 用户信息

    接口地址:

    # 获取用户详情:get
    http://127.0.0.1:8000/users/1/
    
    # 提交:post
    http://127.0.0.1:8000/users/1/
    
    # 修改:update(patch)
    http://127.0.0.1:8000/users/1/
    

    需求:

    • 获取单个用户信息(只能获取当前登录用户的信息,所以必须登录)
    • 修改用户信息

    1、users/serializers.py

    class UserDetailSerializer(serializers.ModelSerializer):
        """用户详情:用于用户个人中心"""
        class Meta:
            model = User
            fields = ("name", "birthday", "gender", "email", "mobile")
    

    2、users/views.py

    class UserCreateViewSet(CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, viewsets.GenericViewSet):
        """
        创建用户、注册用户、修改用户信息、获取用户详情
        """
        serializer_class = UserSerializer
        queryset = User.objects.all()
        authentication_classes = (JSONWebTokenAuthentication, authentication.SessionAuthentication)
    
        def create(self, request, *args, **kwargs):
            serializer = self.get_serializer(data=request.data)
            serializer.is_valid(raise_exception=True)
            user = self.perform_create(serializer)
            re_dict = serializer.data
            payload = jwt_payload_handler(user)
            re_dict["token"] = jwt_encode_handler(payload)
            re_dict["name"] = user.name if user.name else user.username
    
            headers = self.get_success_headers(serializer.data)
    
            return Response(re_dict, status=status.HTTP_201_CREATED, headers=headers)
    
        def get_permissions(self):
            """
            设置动态权限:用户注册时没有权限限制,获取用户详情必须登录才可以
            :return:
            """
            if self.action == "retrieve":
                return [permissions.IsAuthenticated()]
            elif self.action == "create":
                return []
    
            return []
    
        def get_serializer_class(self):
            """
            动态选择使用哪个序列化方式
            UserSerializer:用于用户注册,UserDetailSerializer:用于返回用户详情
            :return:
            """
            if self.action == 'retrieve':
                return UserDetailSerializer
            elif self.action == 'create':
                return UserSerializer
            return UserDetailSerializer
    
        def get_object(self):
            """
            获取登录用户
            用于返回用户对象,判断当前是哪个用户,配合 UserDetailSerializer 获取用户详情
            :return:
            """
            return self.request.user  # 即当前登录用户
    
        def perform_create(self, serializer):
            return serializer.save()
    

    与注册使用的同一视图函数 UserCreateViewSet,只是在原有基础上多继承了 RetrieveModelMixin,用于获取用户详情。

    另外需要注意的是视图函数要动态设置权限认证、序列化方法:

    • 用户注册:不需要 jwt 验证,序列化类 UserSerializer
    • 用户详情:需要 jwt 验证,序列化类 UserDetailSerializer

    因此需要重写 get_permissions()、get_serializers_class() 方法,根据动作动态选择。

    3. 用户收藏

    接口地址:

    # 获取所有收藏:get,ListModelMixin
    http://127.0.0.1:8000/userfavs/
    
    # 取消收藏:delete,需要指定商品 id ,DestroyModelMixin
    http://127.0.0.1:8000/userfavs/1/
    

    1、user_operation/serializers.py

    class UserFavDetailSerializer(serializers.ModelSerializer):
        """
        收藏详情
        """
        # 通过商品 id 获取收藏的商品,需要嵌套商品的序列化
        goods = GoodsSerializer()
    
        class Meta:
            model = UserFav
            fields = ('goods', 'id')
    

    2、user_operation/views.py

    class UserFavViewSet(viewsets.GenericViewSet, mixins.ListModelMixin, mixins.CreateModelMixin, mixins.DestroyModelMixin):
        """
        用户商品收藏
        ListModelMixin:收藏列表
        CreateModelMixin:收藏
        DestroyModelMixin:取消(删除)收藏,相应地要删除数据库中数据
        """
        serializer_class = UserFavSerializer
        queryset = UserFav.objects.all()
    
        # IsAuthenticated:必须登录用户;IsOwnerOrReadOnly:必须是当前登录的用户
        permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
    
        # 用户认证
        authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
    
        # 搜索的字段
        lookup_field = 'goods_id'
    
        def get_serializer_class(self):
            """
            动态设置 serializer,get 时获取用户收藏详情
            :return:
            """
            if self.action == 'list':
                # 收藏列表
                return UserFavDetailSerializer
            elif self.action == 'create':
                return UserFavSerializer
    
            return UserFavSerializer
    
        def get_queryset(self):
            # 只能查看当前登录用户的收藏,禁止获取其他用户的收藏
            return UserFav.objects.filter(user=self.request.user)
    

    4. 用户留言

    接口地址:

    # 获取所有留言:get
    http://127.0.0.1:8000/messages/
    
    # 添加留言:post 参数
    http://127.0.0.1:8000/messages/
    
    # 删除留言:delete
    http://127.0.0.1:8000/messages/messageId
    

    需求:

    • 获取当前登录用户所有留言:ListModelMixin
    • 新建留言:CreateModelMixin
    • 删除留言:DestroyModelMixin

    1、user_operation/serializers.py

    class UserLeavingMessageSerializer(serializers.ModelSerializer):
        """用户留言"""
        # 获取当前登录用户
        user = serializers.HiddenField(
            default=serializers.CurrentUserDefault()
        )
        # read_only:只返回,post时候可以不用提交,format:格式化输出
        add_time = serializers.DateTimeField(read_only=True, format="%Y-%m-%d %H:%M")
    
        class Meta:
            model = UserLeavingMessage
            fields = ('user', 'message_type', 'subject', 'message', 'file', 'id', 'add_time')
    

    2、user_operation/views.py

    class UserLeavingMessageViewSet(viewsets.GenericViewSet, mixins.CreateModelMixin, mixins.ListModelMixin,
                                    mixins.DestroyModelMixin):
        """
        用户留言:添加留言、删除留言、留言列表
        """
        serializer_class = UserLeavingMessageSerializer
        permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
        authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
    
        def get_queryset(self):
            """用户只能看自己的留言"""
            return UserLeavingMessage.objects.filter(user=self.request.user)
    

    3、MxShop/urls.py

    router.register(r'messages', UserLeavingMessageViewSet, basename='message')  # 用户留言
    

    注意:这里没有处理文件相关,所以必须上传文件

    5. 用户收藏地址

    接口地址:

    # 获取所有地址:get
    http://127.0.0.1:8000/address/
    
    # 添加地址:post 参数
    http://127.0.0.1:8000/address/
    
    # 删除地址:delete
    http://127.0.0.1:8000/address/addressID
    
    # 修改地址:update
    http://127.0.0.1:8000/address/addressID
    

    需求:

    • 获取当前登录用户所有收件地址:ListModelMixin
    • 新建地址:CreateModelMixin
    • 删除地址:DestroyModelMixin
    • 更新地址:updateModelMixin

    1、user_operation/serializers.py

    class UserAddressSerializer(serializers.ModelSerializer):
        """用户地址"""
        # 获取当前用户
        user = serializers.HiddenField(
            default=serializers.CurrentUserDefault()
        )
        add_time = serializers.DateTimeField(read_only=True, format="%Y-%m-%d %H:%M")
    
        class Meta:
            model = UserAddress
            fields = ('user', 'province', 'city', 'district', 'address', 'signer_name', 'signer_mobile', 'add_time', 'id')
    

    2、user_operation/views.py

    class UserAddressViewSet(viewsets.GenericViewSet, mixins.CreateModelMixin, mixins.ListModelMixin,
                             mixins.DestroyModelMixin, mixins.UpdateModelMixin):
        """
        用户收件地址:新增地址(CreateModelMixin)、删除地址(DestroyModelMixin)
        、所有地址(ListModelMixin)、更新地址(UpdateModelMixin)
        """
        serializer_class = UserAddressSerializer
        authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
        permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
    
        def get_queryset(self):
            """用户只能查看自己的收藏地址"""
            return UserAddress.objects.filter(user=self.request.user)
    

    3、MxShop/urls.py

    router.register(r'address', UserAddressViewSet, basename='address')  # 收藏地址
    

  • 相关阅读:
    spark 读取mongodb失败,报executor time out 和GC overhead limit exceeded 异常
    在zepplin 使用spark sql 查询mongodb的数据
    Unable to query from Mongodb from Zeppelin using spark
    spark 与zepplin 版本兼容
    kafka 新旧消费者的区别
    kafka 新生产者发送消息流程
    spark ui acl 不生效的问题分析
    python中if __name__ == '__main__': 的解析
    深入C++的new
    NSSplitView
  • 原文地址:https://www.cnblogs.com/midworld/p/13629727.html
Copyright © 2020-2023  润新知