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. jQuery 文本插入和标签移动方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. git rebase 和 git merge 总结

    git merge 和 git rebase 都是用于合并分支,但二者是存在区别的. 在使用时,记住以下两点: 当你从 remote 去 pull 的时候,永远使用 rebase(除了一个例外) 当你 ...

  3. Web前端面试指导(十二):::before 和:before有什么区别?

    题目点评 这个问题看来很简单,但如果之前没有琢磨这个问题,给人感觉也是门头一垂,听到这个题目就懵逼了,因为原来从来没有注意过这个问题,即便有注意这个问题也不能很好的回答清楚.回答的技巧就是从相同点和不 ...

  4. linux漏洞分析入门笔记-bypass_PIE

    ubuntu 16.04 IDA 7.0 docker 0x00:漏洞分析 1.ASLR的是操作系统的功能选项,作用于executable(ELF)装入内存运行时,因而只能随机化stack.heap. ...

  5. libcurl 中使用curl_multi_perform()函数执行订阅类型url的问题

    前提概要 当需要同时处理多个url时,可采用curl_multi_perform方式执行,如下代码1: //初始化一个multi curl 对象 CURLM * curl_m = curl_multi ...

  6. NetBeans 仿notepad++风格

    一直喜欢notepad++配色跟Courier New字体.但notepad++毕竟功能有限. 改用了NetBeans,调整了下样式,终于感觉看着舒服了. 下载链接:点击下载,配置里导入就OK 风格截 ...

  7. day009-IO流

    什么叫流?就是数据的流动.以内存为基准,分为输入input和输出output.输入也叫做读取数据,输出也叫写出数据. 分类 按数据的流向分: 输入流.输出流 按数据类型分:    字节流.字符流 1. ...

  8. 调查UIRecorder 测试报告的CI(集成)实现方式

    以下内容来自uirecorder官网: 如何接入Jenkins? 添加命令 source ./install.sh source ./run.sh 添加报告 JUnit: reports/index. ...

  9. vue2.x 随记

    1. 外部js调用vue的方法等 将vue实例中的this传入外部js文件(比如作为某方法的参数),即可访问传入实例的所有内容.调用该实例中子组件的方法,用$refs. 2. 路由参数 传递:vm.$ ...

  10. 如何在Chrome development tool里查看C4C前台发送的请求细节

    我们可以在Chrome development tool的network tab里观察到从前台UI发送到后台的HTTP请求: 更多Chrome Development Tool的使用工具请查看我的博客 ...