$Django patch与put,视图组件,路由控制,响应器
1 patch与put(幂等?回顾)
PATCH 与 PUT 属性上的一个重要区别还在于:PUT 是幂等的,而 PATCH 不是幂等的。
幂等是一个数学和计算机学概念,在计算机范畴内表示一个操作执行任意次对系统的影响跟一次是相同。
2 视图组件
# 第一种方案 class List:
def list(self,request):
queryset = self.queryset
bs = self.serializers(queryset, many=True)
return JsonResponse(bs.data,safe=False)
class Create:
def create(self,request):
print(request.data) bs = PublishSerializers(data=request.data)
if bs.is_valid():
bs.save() # 生成记录
return JsonResponse(bs.data,safe=False)
else: return JsonResponse(bs.errors,safe=False)
class PublishView(APIView,List,Create):
queryset=Publish.objects.all()
serializers=PublishSerializers
def get(self, request):
return self.list(request) def post(self, request):
# 添加一条数据
return self.create(request)
自定义
# 第二种方案 drf提供的封装的类
from rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, \
DestroyModelMixin
from rest_framework.generics import GenericAPIView class PublishView(GenericAPIView, ListModelMixin, CreateModelMixin):
queryset = Publish.objects.all()
serializer_class = PublishSerializers def get(self, request):
return self.list(request) def post(self, request):
# 添加一条数据
return self.create(request) class PublishDetailView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):
queryset = Publish.objects.all()
serializer_class = PublishSerializers def get(self, request, pk):
return self.retrieve(request, pk) def put(self, request, pk):
return self.update(request, pk) def delete(self, request, pk):
return self.destroy(request, pk)
drf内置_方案1
# 第三种方法:
from rest_framework.generics import ListCreateAPIView, ListAPIView, RetrieveUpdateDestroyAPIView class PublishView(GenericAPIView, ListModelMixin, CreateModelMixin):
class PublishView(ListCreateAPIView):
queryset = Publish.objects.all()
serializer_class = PublishSerializers class PublishDetailView(RetrieveUpdateDestroyAPIView):
queryset = Publish.objects.all()
serializer_class = PublishSerializers
drf内置_方案2
# 第三种:
# 路由:
url (r'^publish/$', views.PublishView.as_view ({'get': 'list', 'post': 'create'})),
url (r'^publish/(?P<pk>\d+)', views.PublishView.as_view ({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
#视图
from rest_framework.viewsets import ModelViewSet
class PublishView(ModelViewSet):
queryset = Publish.objects.all()
serializer_class = PublishSerializers # 最终: ViewSetMixin
# 它有什么作用?用了它之后, 视图类中不需要写get, post, put方法了, 自己定义方法就可以了
# 让请求方法对应到自己定义的方法上, 配置路由
drf内置_方案3(不建议用)
#路由
url(r"book/$",views.Book.as_view({'get':'test'})),
url(r"book/(?P<pk>)\d+",views.Book.as_view({"get":"test2"}))
#一个类可以写5个操作(增删改查查),
from rest_framework.viewsets import ViewSetMixin
# 注意先后顺序,ViewSetMixin写在前面
class TestAll(ViewSetMixin,APIView):
def test(self,request):
print(settings.DEBUG) return HttpResponse('test') def test2(self, request):
return HttpResponse('test2') def test3(self, request):
return HttpResponse('test3')
drf_方案3的黑魔法类ViewSetMixin(常用)
3 路由控制
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^books/$', views.BookView.as_view()),
url(r'^books/(?P<pk>\d+)$', views.BookDetailView.as_view()),
]
1原始路由
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^publish/$', views.PublishView.as_view({'get':'list','post':'create'})),
url(r'^publish/(?P<pk>\d+)/$', views.PublishView.as_view({'get':'retrieve','put':'update','delete':'destroy'})), ] from rest_framework.viewsets import ModelViewSet
class PublishView(ModelViewSet):
queryset=models.Publish.objects.all()
serializer_class=PublishSerializers
2半自动路由(视图类继承ViewSetMixin/ModelViewSet)
from django.conf.urls import url,include
from app01 import views
from rest_framework import routers
router=routers.DefaultRouter()
# 两个参数,一个是匹配的路由,一个是视图中写的CBV的类
router.register('publish',views.PublishView)
urlpatterns = [
# http://127.0.0.1:8000/publish/format=json(渲染器通过这个判断,返回渲染的页面)
# url(r'^publish/', views.PublishView.as_view({'get':'list','post':'create'})),
# http://127.0.0.1:8000/publish.json(渲染器通过这个判断,返回渲染的页面)
# url(r'^publish\.(?P<format>\w+)$', views.PublishView.as_view({'get':'list','post':'create'})), # 可以用 以下方式访问
# 1 http://127.0.0.1:8000/publish/
# 2 http://127.0.0.1:8000/publish.json
# 3 http://127.0.0.1:8000/publish/3
# 4 http://127.0.0.1:8000/publish/3.json
url(r'',include(router.urls))
] from rest_framework.viewsets import ModelViewSet
class PublishView(ModelViewSet):
queryset=models.Publish.objects.all()
serializer_class=PublishSerializers
3全自动路由(视图类必须继承ModelViewSet)
4 响应器
作用:
根据 用户请求URL 或 用户可接受的类型,筛选出合适的 渲染组件。
用户请求URL:
http://127.0.0.1:8000/test/?format=json
http://127.0.0.1:8000/test.json
内置响应器:
#内置响应器
#显示json格式:JSONRenderer
#默认显示格式:BrowsableAPIRenderer(可以修改它的html文件)
#表格方式:AdminRenderer
#form表单方式:HTMLFormRenderer #使用(基本上不需要你配置):
#局部配置
#视图类中:
from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
renderer_classes=[JSONRenderer,BrowsableAPIRenderer]
#全局配置
#在setting中:
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES':['rest_framework.renderers.JSONRenderer']
}
视图组件总结:
from rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin,DestroyModelMixin
#类内只有一个方法分别实现了list:get,create:post,|单条操作 retrieve:get,update:put,destroy:delete
from rest_framework.generics import GenericAPIView, ListAPIView, CreateAPIView, ListCreateAPIView, RetrieveUpdateDestroyAPIView
#GenericAPIView:提供queryset,serializers与ListModelMixin, CreateModelMixin等一起用(解耦和,独特)
#ListAPIView:继承了ListModelMixin 内部定义了get方法 () #后面的一样
from rest_framework.viewsets import ModelViewSet
#ModelViewSet:get,post,put方法了,自己定义方法就可以了让请求方法对应到自己定义的方法上,配置路由
from rest_framework.response import Response
#返回对象可以是Response注册了rest_framework有界面/json格式选择,Jsonresponse只有json格式,
随机推荐
- 声源测向: TDOA-GCC-PATH方法
收藏链接: http://www.funcwj.cn/2018/05/10/gcc-phat-for-tdoa-estimate/
- Docker 从入门到放弃(四)Docker+Jenkins_自动化持续集成
Windows 查看密码 $ cat /var/jenkins_home/secrets/initialAdminPassword 14e14c414f41481aa5955753d3f31f9f 自 ...
- java中获取request与response对象的方法
Java 获取Request,Response对象方法 第一种.参数 @RequestMapping("/test") @ResponseBody public void sa ...
- UDF简记
摘要: 1.开发UDF 2.开发UDAF 3.开发UDTF 4.部署与测试 5.一个简单的实例 内容:1.开发UDF 函数类需要继承org.apache.hadoop.hive.ql.UDF 实现ev ...
- 细说REST API安全之防止重放攻击
一. 重放攻击概述 百科对重放攻击的描述:https://zh.wikipedia.org/wiki/%E9%87%8D%E6%94%BE%E6%94%BB%E5%87%BB简而言之,重放攻击的产生是 ...
- hasnMap的基本操作 源码(三)
一.初始化: hashMap有四种初始化方式: public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity ...
- (5)top k大的数目
一.问题 在一个很长的数组中,求出top k大小的数目 二.办法 用优先队列 时间复杂度O(nlog(k)),应该是最差的情况下是这个 三.Code package algorithm; import ...
- VS中ipch文件夹和sdf文件的处理方式
ipch文件夹和sdf是VS产生的预编译头文件和智能提示信息,对编码没有影响,可存放在固定的位置,定期进行清理
- CF961G Partitions
传送门 luogu 显然每个数的贡献可以一起算感性理解一下,于是答案就是权值总和乘以每个数被算了几次 那个"集合大小为\(|S|\)的集合权值为权值和乘\(|S|\)",可以看成一 ...
- 彻底解决CDH5.12安装过程中 Error: JAVA_HOME is not set and Java could not be found
1 详细报错 + cat+======================================================================+| Error: JAVA_HO ...