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. ul+js模拟select

    html   css .select_box{ float: left; } .select_box input{ width: 160px; height: 30px; text-align: ce ...

  2. C#学习基础(1)命名约定

    c#语言规范建议使用特定大小写约定创建字标识符 Pascal 大小写     标识符中每个单词的首字母大写   用于类型名和成员名  例如:CarDeck,FirstName Camel 大小写   ...

  3. Nginx+PM2+Node.js最简单的配置

    一个最简单的反向代理配置方式 server { listen ; server_name www.luckybing.top; location / { proxy_pass http://127.0 ...

  4. Array、ArrayList和List三者的区别

    数组 class TestArraysClass { static void Main() { // Declare a single-dimensional array ]; // Declare ...

  5. javascript获取后台传来的json

    Mvc Razor视图引擎中 <script type="text/javascript"> var _temp = @(new MvcHtmlString(this. ...

  6. Java使用UDP聊天程序

    主要想测试Java UDP通信.Java UDP使用DatagramSocket和DatagramPacket完成UDP通信 主要思路: 1.本机通信,ip地址为:127.0.0.1 2.开一个线程监 ...

  7. struts2返回结果类型

    在action下还有result标签 1.result不只有name,其实还有type result返回类型在struts-default.xml默认的配置文件中有定义,可以看到有result-typ ...

  8. 靠谱的div引入任何外链内容

    靠谱的div引入任何外链内容 开发中经常要在div中引入一个页面,该页面可能是内部页面,可能是一个外部页面,也可能只是一个域名获取的请求. 对于内部页面的加载,建议使用jquery的load函数,如: ...

  9. vue+mock.js+element-ui模拟数据搞定分页

    效果如图: 前提是搭好vue前端框架,npm install mockjs引入mock.js 当前页全部代码如下,其他有关element-ui的引入未提到,仅作参考用 <!-- 用户管理 --& ...

  10. spring----对IoC和DI的理解

      学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和 ...