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  

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

  

Restframework中的Request的更多相关文章

  1. restframework中的那些参数你知道吗?

    序列化是很重要的过程, 在构建数据结构的时候, 往往会出现很多意想不到的问题, 有一些参数你要用, 但是没有办法穿过来, 怎么办> 今天这篇博客就是写我之前的一个小项目中用restframewo ...

  2. Restframework中常见API的编写方式

    1.框架一(继承APIView) 这里的第一部分使用骨架请参考我的博客(第三篇),它采用了restframework中最基础的办法(APIView)实现了相关请求,以下的框架都是基于它的 2.框架二( ...

  3. 在SpringMVC中获取request对象

    1.注解法 @Autowired private  HttpServletRequest request; 2. 在web.xml中配置一个监听 <listener> <listen ...

  4. 在SpringMVC中获取request对象的几种方式

    1.最简单的方式(注解法) @Autowired private HttpServletRequest request; 2.最麻烦的方法 a. 在web.xml中配置一个监听 <listene ...

  5. LoadRunner中取Request、Response

    LoadRunner中取Request.Response LoadRunner两个“内置变量”: 1.REQUEST,用于提取完整的请求头信息. 2.RESPONSE,用于提取完整的响应头信息. 响应 ...

  6. Freemarker中通过request获得contextPath

    <!-- config Freemarker View Resolver--> <bean id="viewResolver" class="org.s ...

  7. Action中取得request,session的四种方式

    Action中取得request,session的四种方式 在Struts2中,从Action中取得request,session的对象进行应用是开发中的必需步骤,那么如何从Action中取得这些对象 ...

  8. struts2中获取request、response,与android客户端进行交互(文件传递给客户端)

    用struts2作为服务器框架,与android客户端进行交互需要得到request.response对象. struts2中获取request.response有两种方法. 第一种:利用Servle ...

  9. java中解决request中文乱码问题

    request乱码问题(当我们提交的数据中含有中文信息时),分两种情况: 通过post方式提交数据给Servlet Servlet服务端部分代码: public void doPost(httpSer ...

随机推荐

  1. 1.Vue.js的常用指令

      Vue.js介绍 Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得 ...

  2. git提交代码报错 trailing whitespace的解决方法

    1. git提交代码报错 trailing whitespace 禁止执行pre-commit脚本 进入到项目目录中 chmod a-x .git/hooks/pre-commit 2.git提交代码 ...

  3. Bootstrap入门(第一天)

    一直都想认真的学习一下Bootstrap,但是由于种种原因,一直没有行动,虽然期间有使用过Bootstrap,但是都没有系统的学习过.最近工作室(学校老师的工作室)安排了一个前端任务让我跟进,主要是根 ...

  4. JavaScript实现StringBuffer

    function StringBuffer() { this._strings = new Array(); } StringBuffer.prototype.Append = function(_s ...

  5. Cookie的创建、读取、删除

    创建Cookie: HttpCookie cookie =  new HttpCookie(COOKIE_NAME_FOR_USER);cookie.Expires = DateTime.Now.Ad ...

  6. Jquery-ajax()方法提交json数据

    1.ajax()提交json数据代码 var strJson = getStrPayJson(); $.ajax({ type: "POST", url: "/userc ...

  7. SVN服务器在Ubuntu16.04下搭建多版本库详细教程

    1  介绍  Subversion是一个自由,开源的版本控制系统,这个版本库就像一个普通的文件服务器,不同的是,它可以记录每一次文件和目录的修改情况.这样就可 以很方面恢复到以前的版本,并可以查看数据 ...

  8. C# 矩阵运算和一些基本的几何运算

    以前工作中写的,这里备个份,有可能用到 基本的矩阵运算类,测试20阶以内应该没啥问题,超过20阶不好使... /// <summary> /// 矩阵 异常 512索引 1024无解 20 ...

  9. 详解WebApp与Native App的区别

    一篇真的很棒关于html5的Web App与Native App的技术分析 ! 自Iphone和Android这两个牛逼的手机操作系统发布以来,在互联网界从此就多了一个新的名词-WebApp(意为基于 ...

  10. Arcgis flex 切片地图麻点

    在arcgis server中发布地图切片完成后,有时候在访问地图的时候会出现很多麻点, 其实是你切片的时候没有注意到一些选项.... 默认的切片是PNG8,说到这可能就明白了吧,png8的色彩范围: ...