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

Restframework中的Request的更多相关文章
- restframework中的那些参数你知道吗?
序列化是很重要的过程, 在构建数据结构的时候, 往往会出现很多意想不到的问题, 有一些参数你要用, 但是没有办法穿过来, 怎么办> 今天这篇博客就是写我之前的一个小项目中用restframewo ...
- Restframework中常见API的编写方式
1.框架一(继承APIView) 这里的第一部分使用骨架请参考我的博客(第三篇),它采用了restframework中最基础的办法(APIView)实现了相关请求,以下的框架都是基于它的 2.框架二( ...
- 在SpringMVC中获取request对象
1.注解法 @Autowired private HttpServletRequest request; 2. 在web.xml中配置一个监听 <listener> <listen ...
- 在SpringMVC中获取request对象的几种方式
1.最简单的方式(注解法) @Autowired private HttpServletRequest request; 2.最麻烦的方法 a. 在web.xml中配置一个监听 <listene ...
- LoadRunner中取Request、Response
LoadRunner中取Request.Response LoadRunner两个“内置变量”: 1.REQUEST,用于提取完整的请求头信息. 2.RESPONSE,用于提取完整的响应头信息. 响应 ...
- Freemarker中通过request获得contextPath
<!-- config Freemarker View Resolver--> <bean id="viewResolver" class="org.s ...
- Action中取得request,session的四种方式
Action中取得request,session的四种方式 在Struts2中,从Action中取得request,session的对象进行应用是开发中的必需步骤,那么如何从Action中取得这些对象 ...
- struts2中获取request、response,与android客户端进行交互(文件传递给客户端)
用struts2作为服务器框架,与android客户端进行交互需要得到request.response对象. struts2中获取request.response有两种方法. 第一种:利用Servle ...
- java中解决request中文乱码问题
request乱码问题(当我们提交的数据中含有中文信息时),分两种情况: 通过post方式提交数据给Servlet Servlet服务端部分代码: public void doPost(httpSer ...
随机推荐
- docker 摘要(入门版)
Docker 安装 macOS或者windows 下载boot2docker工具 CentOS yum install docker-io -y systemctl start docker dock ...
- TFS2013 设置签出独占锁(转载)
作者:晓菜鸟 出处:http://www.cnblogs.com/52XF/p/4239056.html 在使用TFS进行源代码管理的时候VS默认允许多个签出,但在团队开发中往往需要设置独占锁(排他锁 ...
- oracle学习篇三:SQL查询
select * from emp; --1.找出部门30的员工select * from emp where deptno = 30; --2.列出所有办事员(CLERK)的姓名,变化和部门编号se ...
- lxml模块(应用xpath技术)
一.lxml介绍 第三方库lxml是第一款表现出高性能特征的python xml库,天生支持Xpath1.0.XSLT1.0.定制元素类,甚至python风格的数据绑定接口.lxml是通过Cpytho ...
- H5跟ios、android交互跟数据对接
需求: APP要用H5页面做展示,而且要获取到对应的商品ID,用户点击H5页面跳回APP原生页面. 方法: 先要判断用户是ios还是android设备(这里只考虑ios跟android,因为它俩写法还 ...
- 利用actionscript访问wfs服务
以后整理……</> private function search_clickHandler():void{ op="search"; var urlLoader:UR ...
- File GDB API
bbs一问一答 https://blogs.esri.com/esri/arcgis/2010/12/13/file-geodatabase-api-details/ 下载页面 http://www. ...
- 使用notebook 笔记(1)
1 去开启远程访问notebook 注意事项 安装好Ipython notebook 之后, 开启服务的方式如下: ipython notebook --profile=nbserver --ip= ...
- ubuntu14.04安装rabbitmq
ubuntu14.04安装rabbitmq及配置 1.修改/etc/apt/sources.list文件 命令:vi /etc/apt/sources.list 在最后一行加上:deb http: ...
- matlab练习程序(模拟退火SA)
模拟退火首先从某个初始候选解开始,当温度大于0时执行循环. 在循环中,通过随机扰动产生一个新的解,然后求得新解和原解之间的能量差,如果差小于0,则采用新解作为当前解. 如果差大于0,则采用一个当前温度 ...