drf 视图功能
视图
drf提供的视图功能
自己的第一次封装
#一个功能写成一个类,方便组合,只要继承它就可以有这个功能
#将功能都写在一个类中,可控性就会变差
from book.myserializers import BookSerializer, PublishSerializer
from rest_framework.response import Response
class List():
def list(self, request, *args, **kwargs):
list = self.model.objects.all()
if list:
ser = self.ser(instance=list, many=True)
return Response(ser.data)
return Response({"msg": '获取失败'})
class Get()
def get(self, request, *args, **kwargs):
id = args[0]
obj = self.model.objects.filter(pk=id).first()
obj_ser = self.ser(instance=obj, many=False)
return Response(obj_ser.data)
class Post():
def post(self, request):
res = {"staus": 100, "msg": "新增成功", "data": []}
ser = self.ser(data=request.data)
if ser.is_valid():
ser.save()
res["data"] = ser.data
else:
res["msg"] = "新增失败"
res["data"] = ser.errors
return Response(res)
class Put()
def put(self, request, id, *args, **kwargs):
res = {"staus": 100, "msg": "更新成功", "data": []}
obj = self.model.objects.filter(pk=id).first()
obj_ser = self.ser(data=request.data, instance=obj)
if obj_ser.is_valid():
obj_ser.save()
else:
res["msg"] = "更新失败"
res["data"] = obj_ser.errors
return Response(res)
class Delete():
def delete(self, request, id, *args, **kwargs):
print(1)
res = {"staus": 100, "msg": "删除成功", "data": []}
obj = self.model.objects.filter(pk=id).first()
if obj:
obj.delete()
return Response(res)
res["msg"] = "删除失败"
return Response(res)
class Books(List,POST, APIView):
model = Book
ser = BookSerializer
class Books(Get,Delete,Put):
model = Book
ser = BookSerializer
drf的第一次封装
#新增方法
from rest_framework.mixins import CreateModelMixin
#删除方法
from rest_framework.mixins import DestroyModelMixin
#获取所有方法
from rest_framework.mixins import ListModelMixin
#更新方法
from rest_framework.mixins import UpdateModelMixin
#获取单个方法
from rest_framework.mixins import RetrieveModelMixin
#使用封装,不再继承APIView类,继承GenericAPIView(继承了APIView)
from rest_framework.generics import GenericAPIView
class Books(ListModelMixin,CreateModelMixin,GenericAPIView):
#指定序列化类
serializer_class = BookSerializer
#对象们
queryset = Book.objects.all()
#必须写get方法的原因是父类没有get方法而是list方法
def get(self,request,*args,**kwargs):
return self.list(request,*args,**kwargs)
def post(self,request,*args,**kwargs):
return self.create(request,*args,**kwargs)
class MyBook(RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,GenericAPIView):
serializer_class = BookSerializer
#对象们,获取单个对象,所以url中必须以表中的字段分组
queryset = Book.objects.all()
'''
以pk(主键)作为分组字段,以便retrieve方法内部筛选使用
url(r'^books/(?P<pk>\d+)', views.MyBook.as_view(),),
'''
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
#第一次封装,都需要写类似的方法get,delete...
drf第二次封装
from rest_framework.generics import ListCreateAPIView
from rest_framework.generics import RetrieveUpdateDestroyAPIView
class Books(ListCreateAPIView):
serializer_class = BookSerializer
queryset = Book.objects.all()
class MyBook(RetrieveUpdateDestroyAPIView):
serializer_class = BookSerializer
queryset = Book.objects.all()
#可以不定义get,post方法的原因是父类中有get,post等方法
drf第三次封装
视图层
from rest_framework.viewsets import ModelViewSet
class Books(ModelViewSet):
serializer_class = BookSerializer
queryset = Book.objects.all()
路由层
url(r'^books/$', views.Books.as_view({'get':'list','post':'create'})),
url(r'^books/(?P<pk>\d+)',views.Books.as_view({'get':'retrieve','put':'update','delete':'destroy'}),),
ViewSetMinix
1.#ModelViewSet继承了GenericViewSet
class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):
pass
2.#GenericViewSet继承了ViewSetMixin
class GenericViewSet(ViewSetMixin, generics.GenericAPIView):
pass
3.#ViewSetMixin重写了view方法,
class ViewSetMixin(object):
@classonlymethod
def as_view(cls, actions=None, **initkwargs):
...
def view(request, *args, **kwargs):
...
#method为请求:get,post...
#actions为 路由中传入的字典
#action为list,create都方法名
#url(r'^books/$', views.Books.as_view({'get':'list','post':'create'}))
'''
def as_view(cls, actions=None, **initkwargs):
'''
for method, action in actions.items():
handler = getattr(self, action)#获取函数地址
setattr(self, method, handler)#将请求指向函数地址
.....
return self.dispatch(request, *args, **kwargs)
...
return csrf_exempt(view)
nginx
什么是反向代理
什么是正向代理
1.负载均衡
2.动静分离(动态文件转给wsgi,静态文件直接去django取)
drf 视图功能的更多相关文章
- DRF视图功能介绍(2)
本帖最后由 杰哥,我就服你 于 2018-12-20 13:22 编辑 Django rest framework(DRF) D:是一个用于构建Web API强大又灵活的框架,基于Django框架二次 ...
- 使用DRF视图集时自定义action方法
在我们用DRF视图集完成了查找全部部门,创建一个新的部门,查找一个部门,修改一个部门,删除一个部门的功能后,views.py的代码是这样子的: class DepartmentViewSet(Mode ...
- drf 认证功能
drf(django rest-framework)认证组件 复习 HyperlinkedIdentityField ```python 功能:快速生成连接 1. publish = seriali ...
- DRF视图-请求与响应
DRF视图 drf的代码简写除了在数据序列化体现以外,在视图中也是可以的.它在django原有的django.views.View类基础上,drf内部封装了许多子类以便我们使用. Django RES ...
- drf 视图使用及源码分析
前言 drf视图的源码非常的绕,但是实现的功能却非常的神奇. 它能够帮你快速的解决ORM增删改查的重复代码,非常的方便好用. 下面是它源码中的一句话: class ViewSetMixin: &quo ...
- DRF 视图组件
目录 DRF 视图组件 视图组件大纲 两个视图基本类 五个扩展类 九个子类视图 视图集 常用视图集父类 魔法类 一览表 DRF中视图的"七十二变" 第一层:基于APIview的五个 ...
- BrnShop开源网上商城第六讲:扩展视图功能
在正式讲解扩展视图功能以前,我们有必要把视图的工作原理简单说明下.任何一个视图都会被翻译成一个c#类,并保存到指定的位置,然后被编译.这也就是为什么能在视图中包含c#代码片段的原因.下面我们通过一个项 ...
- hitTest:withEvent:方法(此方法可实现点击穿透、点击下层视图功能)
此方法可实现点击穿透.点击下层视图功能 一. hitTest:withEvent:调用过程 iOS系统检测到手指触摸(Touch)操作时会将其放入当前活动Application的事件队列,UIAppl ...
- 使用Eclipse Memory Analyzer Tool(MAT)分析线上故障(一) - 视图&功能篇
Eclipse Memory Analyzer Tool(MAT)相关文章目录: 使用Eclipse Memory Analyzer Tool(MAT)分析线上故障(一) - 视图&功能篇 使 ...
随机推荐
- 2017 Multi-University Training Contest - Team 7 Just do it
http://acm.hdu.edu.cn/showproblem.php?pid=6129 题意:一次操作就是i从1~n有 A[i]=A[i]^A[i-1]^A[i-2]...^A[1] 那么这样操 ...
- 删除vi编辑产生的.swp文件(linux编辑文件没有退出时直接关闭程序产生的临时文件)
关于swp文件 使用vi,经常可以看到swp这个文件,那这个文件是怎么产生的呢,当你打开一个文件,vi就会生成这么一个.(filename)swp文件以备不测(不测下面讨论),如果你正常退出,那么这个 ...
- POJ 1015 Jury Compromise dp分组
第一次做dp分组的问题,百度的~~ http://poj.org/problem?id=1015 题目大意:在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑 ...
- Java中的switch语句——通过示例学习Java编程(8)
作者:CHAITANYA SINGH 来源:https://www.koofun.com//pro/kfpostsdetail?kfpostsid=19 当我们在代码逻辑中有多个选项,而且需要为每个选 ...
- AngularJS(四):控制器、事件
本文也同步发表在我的公众号“我的天空” 控制器 控制器可以说是AngularJS中最重要的部分了!之前的一些示例,除了第一讲的示例以外,我们对于AngularJS的使用都集中在HTML部分,其实Ang ...
- AngularJS(二):ng-app指令、表达式
本文也同步发表在我的公众号“我的天空” ng-app指令 AngularJS指令是扩展的HTML属性,所有指令均带有前缀“ng-”,我们学习的第一个指令便是ng-app,其定义了AngularJS管理 ...
- 从typeof()说起
本文也同步发表在我的公众号“我的天空” 首先我们先思考一下,执行下列语句分别会显示什么? alert(typeof(Array)); alert(typeof(Array())); 我们进入正题! 在 ...
- Ubuntu 配置IP地址方法
接到一客户的服务器,开机已启动发现是Ubuntu系统,当时有点郁闷了,心想没有配置过ubuntu系统,这客户还在旁边了,心里有点紧张了,于是开始上网寻找各种方法配置,最终将IP配置好,给客户上架调试通 ...
- MySQL++简单使用记录.md
#1.简介 MySQL++ is a powerful C++ wrapper for MySQL’s C API. Its purpose is to make working with queri ...
- 转 winfrom如何通过http来进行通信,并且通过传递json格式的数据可接受json格式的数据
string username = this.textBox1.Text; string password = this.textBox2.Text; string AA = HttpUtility. ...