$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格式,
随机推荐
- idea使用maven打包项目
第一步:打开maven Projects 第二步.找到package 第三步,运行.到路径下面去找打包的文件吧. 第二种方法: 使用命令 cmd进入项目目录,例如项目在D盘项目名poject 输入: ...
- UESTC - 1999 也许这是唯一能阻止乐爷AK的方法( Just for Fun )(回文树)
https://vjudge.net/problem/UESTC-1999 题意 对于一个初始为空的字符串S,你可以进行以下两种操作: 1. 在S的末尾加一个小写字母. 2. 移除S的最后一个字母. ...
- Win下安装nvm
nvm 是 windows 下切换 node 版本的管理工具,mac 下可以使用 TJ 写的 n . 1.https://github.com/coreybutler/nvm-windows/rele ...
- 【python小练】0000
第 0000 题:将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果. 类似于图中效果 from PIL import Image, ImageDraw, Im ...
- jdbc 日期处理问题
1.从结果集中取得日期部分 resultSet.getDate(); --2013-01-07 2.从结果集中取得时间部分 resultSet.getTime() --22:08:09 3.从结 ...
- jdk环境配置以及java执行过程
下载好jdk,并按照提示一步步安装,最后记下jdk所在的安装位置,这里假设在C:\Program Files (x86)\Java\jdk1.8.0_20 现在开始配置环境变量.鼠标右键点击“计算机” ...
- JavaScript面试技巧(一):基础知识
1.变量类型和计算 变量类型:值类型.引用类型.typeof运算符. 变量计算:字符串拼接.==运算符.if语句.逻辑运算符 2.原型和原型链 构造函数 5个原型规则 3.作用域和闭包-执行上下文 4 ...
- ubuntu下objective-c的编译和运行
ubuntu 下编译objective-c 1.安装编译环境 sudo aptitude install build-essential gobjc gobjc++ gnustep gnustep-d ...
- 第26月第23天 nsobject 单例 CFAbsoluteTimeGetCurrent
1.nsobject 单例 sudo chmod 666 /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources/ ...
- Luogu P2490「JSOI2016」黑白棋
我博弈基础好差.. Luogu P2490 题意 有一个长度为$ n$的棋盘,黑白相间的放$ k$个棋子,保证$ k$是偶数且最左边为白子 每次小$ A$可以移动不超过$ d$个白子,然后小$ B$可 ...