视图

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 视图功能的更多相关文章

  1. DRF视图功能介绍(2)

    本帖最后由 杰哥,我就服你 于 2018-12-20 13:22 编辑 Django rest framework(DRF) D:是一个用于构建Web API强大又灵活的框架,基于Django框架二次 ...

  2. 使用DRF视图集时自定义action方法

    在我们用DRF视图集完成了查找全部部门,创建一个新的部门,查找一个部门,修改一个部门,删除一个部门的功能后,views.py的代码是这样子的: class DepartmentViewSet(Mode ...

  3. drf 认证功能

    drf(django rest-framework)认证组件 复习 HyperlinkedIdentityField ​```python 功能:快速生成连接 1. publish = seriali ...

  4. DRF视图-请求与响应

    DRF视图 drf的代码简写除了在数据序列化体现以外,在视图中也是可以的.它在django原有的django.views.View类基础上,drf内部封装了许多子类以便我们使用. Django RES ...

  5. drf 视图使用及源码分析

    前言 drf视图的源码非常的绕,但是实现的功能却非常的神奇. 它能够帮你快速的解决ORM增删改查的重复代码,非常的方便好用. 下面是它源码中的一句话: class ViewSetMixin: &quo ...

  6. DRF 视图组件

    目录 DRF 视图组件 视图组件大纲 两个视图基本类 五个扩展类 九个子类视图 视图集 常用视图集父类 魔法类 一览表 DRF中视图的"七十二变" 第一层:基于APIview的五个 ...

  7. BrnShop开源网上商城第六讲:扩展视图功能

    在正式讲解扩展视图功能以前,我们有必要把视图的工作原理简单说明下.任何一个视图都会被翻译成一个c#类,并保存到指定的位置,然后被编译.这也就是为什么能在视图中包含c#代码片段的原因.下面我们通过一个项 ...

  8. hitTest:withEvent:方法(此方法可实现点击穿透、点击下层视图功能)

    此方法可实现点击穿透.点击下层视图功能 一. hitTest:withEvent:调用过程 iOS系统检测到手指触摸(Touch)操作时会将其放入当前活动Application的事件队列,UIAppl ...

  9. 使用Eclipse Memory Analyzer Tool(MAT)分析线上故障(一) - 视图&功能篇

    Eclipse Memory Analyzer Tool(MAT)相关文章目录: 使用Eclipse Memory Analyzer Tool(MAT)分析线上故障(一) - 视图&功能篇 使 ...

随机推荐

  1. 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] 那么这样操 ...

  2. 删除vi编辑产生的.swp文件(linux编辑文件没有退出时直接关闭程序产生的临时文件)

    关于swp文件 使用vi,经常可以看到swp这个文件,那这个文件是怎么产生的呢,当你打开一个文件,vi就会生成这么一个.(filename)swp文件以备不测(不测下面讨论),如果你正常退出,那么这个 ...

  3. POJ 1015 Jury Compromise dp分组

    第一次做dp分组的问题,百度的~~ http://poj.org/problem?id=1015 题目大意:在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑 ...

  4. Java中的switch语句——通过示例学习Java编程(8)

    作者:CHAITANYA SINGH 来源:https://www.koofun.com//pro/kfpostsdetail?kfpostsid=19 当我们在代码逻辑中有多个选项,而且需要为每个选 ...

  5. AngularJS(四):控制器、事件

    本文也同步发表在我的公众号“我的天空” 控制器 控制器可以说是AngularJS中最重要的部分了!之前的一些示例,除了第一讲的示例以外,我们对于AngularJS的使用都集中在HTML部分,其实Ang ...

  6. AngularJS(二):ng-app指令、表达式

    本文也同步发表在我的公众号“我的天空” ng-app指令 AngularJS指令是扩展的HTML属性,所有指令均带有前缀“ng-”,我们学习的第一个指令便是ng-app,其定义了AngularJS管理 ...

  7. 从typeof()说起

    本文也同步发表在我的公众号“我的天空” 首先我们先思考一下,执行下列语句分别会显示什么? alert(typeof(Array)); alert(typeof(Array())); 我们进入正题! 在 ...

  8. Ubuntu 配置IP地址方法

    接到一客户的服务器,开机已启动发现是Ubuntu系统,当时有点郁闷了,心想没有配置过ubuntu系统,这客户还在旁边了,心里有点紧张了,于是开始上网寻找各种方法配置,最终将IP配置好,给客户上架调试通 ...

  9. MySQL++简单使用记录.md

    #1.简介 MySQL++ is a powerful C++ wrapper for MySQL’s C API. Its purpose is to make working with queri ...

  10. 转 winfrom如何通过http来进行通信,并且通过传递json格式的数据可接受json格式的数据

    string username = this.textBox1.Text; string password = this.textBox2.Text; string AA = HttpUtility. ...