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 ...
随机推荐
- 文档碎片DocumentFragment
文档碎片是什么? 参考标准的描述,DocumentFragment是一个轻量级的文档对象,能够提取部分文档的树或创建一个新的文档片段,换句话说有文档缓存的作用. createDocumentFragm ...
- 详解ASP.NET MVC Model验证
ASP.NET mvc的最好的优点之一就是支持Model验证,这个特性很方便你可以选择在定义Model的时候在字段中采用特性进行注解约定,也可以在代码中自己进行手动验证.下面就来细说一下ASP.NET ...
- Java Socket通信示例
Socket分为ServerSocket和Socket两大类: 其中ServerSocket用于服务器端,可以通过accept方法监听请求,监听到请求后返回Socket: Socket用户具体完成数据 ...
- 3、card 卡片
1.基本用法的使用 /* --- htm l----*/ <ion-content> <ion-card> <ion-card-header> Header < ...
- Spring mvc框架下使用kaptcha生成验证码
1.下载jar包并导入. kaptcha-2.3.2.jar 2.spring 配置文件 applicationContext.xml. <bean id="captchaProduc ...
- Git读档
$ git config --global user.name "meng kai" $ git config --global user.email 363255751@qq.c ...
- Python爬虫之三种数据解析方式
一.引入 二.回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需 ...
- sublime Error executing: /usr/bin/security dump-trust-settings -d
sublime text2突然crash,无法简单粗暴的关闭,就开始认真解决这个问题. 问题: 参考文献:https://github.com/wbond/package_control/issues ...
- 【代码笔记】Java基础:Java的方法和类
面向过程与面向对象都是我们编程中,编写程序的一种思维方式.例如:公司打扫卫生(擦玻璃.扫地.拖地.倒垃圾等), 按照面向过程的程序设计方式会思考“打扫卫生我该怎么做,然后一件件的完成”,最后把公司卫生 ...
- js匿名函数使用&传参
function () { alert("error"); } //报错:匿名函数不能直接调用 使用 0x01 (function () { alert("Success ...