• Django REST framework 视图和路由


    一、DRF中的request

    在Django REST Framework中内置的Request类扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等。

    比如,区别于Django中的request从request.GET中获取URL参数,从request.POST中取某些情况下的POST数据。

    在APIView中封装的request,就实现了请求数据的解析:

    对于GET请求的参数我们通过request.query_params来获取。

    对于POST请求、PUT请求的数据我们通过request.data来获取。

    将Django中的Request作为了自己的一个属性_request

    属性和方法

     content_type

     stream

     query_params:对于GET请求的参数获取

     data: 同时兼容POST,PUT,PATCH等获取数据

     user:可以直接在请求上获取用户,相当于在请求上添加一个属性,用户对象

     auth:认证,相当于请求上添加一个属性,属性值是token

    二、DRF中的response

    依然是HttpResponse的子类,自己封装data,直接接受字典转换为JSON,以及status状态码

    属性和方法

      rendered_content

      status_text

    三、序列化

    class StudentSerializer(serializers.ModelSerializer):
    
        class Meta:
            model = Student
            fields = '__all__'

    四、初生牛犊不怕虎之徒手垒代码

    1、路由

    path(r'student/', StudentView.as_view())

    2、视图

    class StudentView(APIView):
        def get(self, request):
            student = Student.objects.all()
            stuent_serializer = StudentSerializer(student, many=True)
            return Response(stuent_serializer.data)
    
        def post(self, request):
            student_serializer = StudentSerializer(data=request.data)
            if student_serializer.is_valid():
           student_serializer.save()
    return Response(student_serializer.data) return Response(data={'msg': 'error'}, status=status.HTTP_400_BAD_REQUEST)

     五、小试牛刀使用混合类阶段

    1、路由

    path(r'comment/', CommentView.as_view()),
    re_path(r'student/(?P<pk>d+)/$', StudentDetailView.as_view())

    2、视图1

    class StudentView(mixins.CreateModelMixin, mixins.ListModelMixin, generics.GenericAPIView):
        queryset = Student.objects.all()    # 必须是queryset
        serializer_class = StudentSerializer
    
        def get(self, request, *args, **kwargs):
            return self.list(request, *args, **kwargs)
    
        def post(self, request, *args, **kwargs):
            return self.create(request, *args, **kwargs)

    我们使用GenericAPIView构建了我们的视图,并且用上了ListModelMixinCreateModelMixin

    基类提供核心功能,而mixin类提供.list().create()操作。然后我们明确地将getpost方法绑定到适当的操作。

    3、视图2

    class StudentDetailView(mixins.RetrieveModelMixin,
                      mixins.CreateModelMixin,
                      mixins.UpdateModelMixin,
                      mixins.DestroyModelMixin,
                      generics.GenericAPIView):
        queryset = Student.objects.all()
        serializer_class = StudentSerializer
        
        def get(self, request, *args, **kwargs):
            return self.retrieve(request, *args, **kwargs)
        
        def post(self, request, *args, **kwargs):
            return self.create(request, *args, **kwargs)
        
        def put(self, request, *args, **kwargs):
            return self.update(request, *args, **kwargs)
        
        def delete(self, request, *args, **kwargs):
            return self.destroy(request, *args, **kwargs)

    非常相似。这一次我们使用GenericAPIView类来提供核心功能,并添加mixins来提供.retrieve(),.create(),.update().destroy()操作。

    我们发现在没有查询到数据的时候也不会报错,会返回错误信息。

    注意:必须在路由中指定‘pk’,用于操作单个数据。

    六、牛气冲天之使用通用类

    1、路由

    path(r'comment/', CommentView.as_view()),
    re_path(r'student/(?P<pk>d+)/$', StudentDetailView.as_view())

    2、视图1

    class StudentView(ListCreateAPIView):   # 获取所有数据
        queryset = Student.objects.all()
        serializer_class = StudentSerializer

     3、视图2

    class StudentDetailView(RetrieveUpdateDestroyAPIView):   # 对指定的单条数据进行增删改查
        queryset = Student.objects.all()
        serializer_class = StudentSerializer

     七、牛牛牛牛之使用视图集

    1、路由

    path('student/', StudentView.as_view({
            'get': 'list',
            'post': 'create'
        })),
    re_path(r'student/(?P<pk>d+)/$', StudentView.as_view({
            'get': 'retrieve',
            'put': 'update',
            'patch': 'partial_update',
            'delete': 'destroy'
        }))

    2、视图

    class StudentView(ModelViewSet):
        queryset = Student.objects.all()
        serializer_class = StudentSerializer

    3、高级路由

    router = DefaultRouter()
    router.register(r'student', StudentView)
    urlpatterns += router.urls

    八、继承关系梳理

  • 相关阅读:
    前端工程化之动态数据代理
    webapp开发之需要知道的css细节
    html-webpack-plugin详解
    file-loader引起的html-webpack-plugin坑
    浅谈react受控组件与非受控组件
    React创建组件的三种方式及其区别
    react项目开发中遇到的问题
    css伪元素:before和:after用法详解
    python之文件操作
    python之range和xrange
  • 原文地址:https://www.cnblogs.com/huiyichanmian/p/12260588.html
Copyright © 2020-2023  润新知