zoukankan      html  css  js  c++  java
  • Restframework中的Request

    1.介绍

    该篇博客主要介绍restframework内置的Request类,它扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等。

    如: 在APIView中封装的request,就实现了请求数据的解析:对于GET请求的参数我们通过request.query_params来获取。对于POST请求、PUT请求的数据我们通过request.data来获取。

    1.1 基于APIView的请求

    上一篇中,我们获取请求的方式:

    urls.py

    url(r'comment/',views.CommentView.as_view()),
    url(r'comment/(?P<pk>d+)/$',views.CommentDetail.as_view()), 

    views.py

    from app01 import models
    from app01 import app01_serializers    # 导入验证表
    from rest_framework.views import APIView  
    # 你打开源码,在rest_framework文件夹下还有一个一个views文件,里面有APIView类,它继承了view
    from rest_framework.response import Response
    
    class Comment(APIView):
        def get(self, request, *args, **kwargs):
            query_set = models.School.objects.all()
            ser_obj = app01_serializers.CommentSerializer(query_set, many=True)
            return Response(ser_obj.data)
    
    
    class CommentDetail(APIView):
        def get(self, request, pk, *args, **kwargs):
            obj = models.School.objects.filter(pk=pk).first()
            ser_obj = app01_serializers.CommentSerializer(obj)
            return Response(ser_obj.data) 

     app01_serializers.py(在我们应用下创建的文件)

    from app01.models import Comment
    from rest_framework import serializers
    
    class CommentSerializer(serializers.ModelSerializer):
    
    	class Meta:
    		model = Comment
    		fields = "__all__"
    		depth = 1
    

    1.2  基于GenericAPIView的请求 

    GenericAPIView对APIView再次封装,实现了强大功能。通常使用时,可搭配一个或多个Mixin扩展类:

    1.ListModelMixin      # 提供list方法快速实现列表视图(多条数据)
    
    2.CreateModelMixin    # 提供create方法快速实现创建资源的视图
    
    3.RetrieveModelMixin   # 提供retrieve方法,可以快速实现返回一个存在的数据对象(需要传入pk)
    
    4.UpdateModelMixin     # 提供update方法,可以快速实现更新一个存在的数据对象。 提供partial_update方法,可以实现局部更新
    
    5.DestroyModelMixin   # 提供destroy方法,可以快速实现删除一个存在的数据对象
    

    这五个类分别实现了增删改查的功能,其中ListModelMixin实现的request方法无需传入id值,就可以查找全部数据,而RetrieveModelMixin需要传入id才能实现查找,而且是针对性的

    GenericAPIView属性:

    支持定义的属性:
    
    列表视图与详情视图通用:
    	queryset 			# 列表视图的查询集
    	serializer_class 		# 视图使用的序列化器
    
    列表视图使用:
    	pagination_class 		# 分页控制类
    	filter_backends 		# 过滤控制后端
    
    详情页视图使用:
    	lookup_field 			# 查询单一数据库对象时使用的条件字段,默认为'pk'
    	lookup_url_kwarg 		# 查询单一数据时URL中的参数关键字名称,默认与look_field相同
    

    详细介绍猛戳这里

    urls.py(这里的路由规定必须以“/”结尾,注意后面的路由写入)

    url(r'comment/(?P<pk>d+)/$',views.CommentDetail.as_view()),
    url(r'comment/',views.CommentView.as_view()),

    app01_serializers.py(在我们应用下创建的文件)

    from app01.models import Comment
    from rest_framework import serializers
    
    class CommentSerializer(serializers.ModelSerializer):
    
    	class Meta:
    		model = Comment
    		fields = "__all__"
    		depth = 1

    views.py(这是针对get请求操作)

    from app01 import models
    from app01 import app01_serializers    # 导入验证表
    from rest_framework.mixins import ListModelMixin,RetrieveModelMixin
    from rest_framework.generics import GenericAPIView
    
    class CommentView(GenericAPIView,ListModelMixin):
        # 这里必须要叫做queryset和serializer_class,这两个是在GenericAPIView
        # 的源码里面定义的变量
        queryset = models.Comment.objects.all()
        serializer_class = app01_serializers.CommentSerializer
        def get(self,request,*args,**kwargs):
            return self.list(request,*args,**kwargs)
    
    # 查看指定字段
    class CommentDetail(GenericAPIView,RetrieveModelMixin):
        queryset = models.Comment.objects.all()
        serializer_class = app01_serializers.CommentSerializer
    
        def get(self,request, pk,*args,**kwargs):
            return self.retrieve(request, pk, *args, **kwargs)
    

     

    针对post请求操作(这里和上面操作一致,不过要注意app01_serializers.py下的depth=1一定要注掉,否则会提示出错)

    class CommentView(GenericAPIView, CreateModelMixin):
        queryset = models.Comment.objects.all()
        serializer_class = app01_serializers.CommentSerializer
    
        def post(self,request, *args, **kwargs):
            return self.create(request, *args, **kwargs)
    

    效果:

    针对update和delete请求操作(这两个要使用到id,所以必须传入RetrieveModelMixin)

    class CommentDetail(GenericAPIView, RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin):
        queryset = models.Comment.objects.all()
        serializer_class = app01_serializers.CommentSerializer
        # 更改操作
        def put(self,request,pk):
            return self.update(request,pk,)
    
        # 删除操作
        def delete(self,request,pk,*args, **kwargs):
            return self.destroy(request, pk, *args, **kwargs)
        
        # 这步其实在最后调用了上面的delete操作,做权限认证删除使用(看源码)
        def perform_destroy(self, instance):
            print("你要删除了...")
            instance.delete()
    

    效果:

    1.3 基于GenericAPIView下的RetrieveUpdateDestroyAPIView类实现的请求 

      RetrieveUpdateDestroyAPIView类继承了

                  mixins.RetrieveModelMixin,

                  mixins.UpdateModelMixin,

                  mixins.DestroyModelMixin,

                  GenericAPIView

          这几个类,它拥有get,put,patch和delete方法

    1..4 基于ModelViewSet下的请求

    ModelViewSet视图集会自动提供list,create,retrieve,update&destroy这些行为

    查看源码,它包含6个功能:

    用法:

    urls.py(这里书写还是很麻烦的,下面会在介绍一种简单的url版本)

        url(r'comment/$', views.CommentViewSet.as_view({
            "get": "list",
            "post": "create",
        })),
        url(r'comment/(?P<pk>d+)/$', views.CommentViewSet.as_view({
            'get': 'retrieve',
            'put': 'update',
            'patch': 'partial_update',
            'delete': 'destroy'
        })),

     urls.py(把上面的注掉,我们可以使用restframework自带的类来重写url)

    from rest_framework.routers import DefaultRouter
    
    router = DefaultRouter()
    # 注册路由,表示路径comment对应视图函数CommentViewSet
    router.register(r'comment', views.CommentViewSet)
    urlpatterns += router.urls

    app01_serializers.py(在我们应用下创建的文件)

    from app01.models import Comment
    from rest_framework import serializers
    
    class CommentSerializer(serializers.ModelSerializer):
    
    	class Meta:
    		model = Comment
    		fields = "__all__"
    		
    

     views.py

    # 导入该模块
    from rest_framework.viewsets import ModelViewSet
    
    class CommentViewSet(ModelViewSet):
        queryset = models.Comment.objects.all()
        serializer_class = app01_serializers.CommentSerializer  

    以上也实现了增删改查的效果,而且书写代码量明显减少了,它当中的继承关系如下图所示:

      

  • 相关阅读:
    Tornado Web框架
    使用django实现自定义用户认证
    设置DNS 代理
    Docker
    TCP/IP详解学习笔记(1)-基本概念
    IMS知识学习路径浅谈
    Word文档不能编辑解决方法
    P2P网络“自由”穿越NAT的“秘密”原理
    斗战神 拳猴刷图加点
    斗战神 装备精炼
  • 原文地址:https://www.cnblogs.com/LearningOnline/p/9410677.html
Copyright © 2011-2022 走看看