视图

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. PHPstudy安装redis扩展

    PHPstudy安装redis扩展 第一步:查看PHP版本(phpinfo) 第二步:下载所需的扩展(http://pecl.php.net/package/redis   .   http://wi ...

  2. NET Core 2.0 介绍和使用

    NET Core 2.0 特性介绍和使用指南 阅读目录 前言 特性概述 使用指南 .NET Core 2.0和1.0/1.1之间的关系 .NET CORE Rumtime改进 .NET Core SD ...

  3. Json规范

    标准格式 书写使用首字母小写驼峰式 {" status":0   //状态 大于0代表正常.小于等于0代表异常 "message":"",/ ...

  4. 通过sqlserver sa密码修改windows操作系统密码

    如果你不记得windows管理员的密码了,但知道sqlserver sa用户的密码,可以通过以下方式修改: 进入SQL之后执行以下语句: -- 允许配置高级选项  EXEC sp_configure ...

  5. 机器学习框架ML.NET学习笔记【5】多元分类之手写数字识别(续)

    一.概述 上一篇文章我们利用ML.NET的多元分类算法实现了一个手写数字识别的例子,这个例子存在一个问题,就是输入的数据是预处理过的,很不直观,这次我们要直接通过图片来进行学习和判断.思路很简单,就是 ...

  6. 表单验证插件jquery.validate.js

    最常使用JavaScript的场合就是表单的验证,而jQuery作为一个优秀的JavaScript库,也提供了一个优秀的表单验证插件----Validation.Validation是历史最悠久的jQ ...

  7. HDU 2899Strange fuction(模拟退火)

    题意 题目链接 求 $F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x (0 <= x <=100)$的最小值 Sol 强上模拟退火,注意eps要开大! /* */ ...

  8. PHP变量、数据类型、字符串、运算符、条件语句、循环语句、数组、函数

    PHP 简介: php :是一门动态交互的计算机语言  静态交互 html  css  js 但凡是动态交互的 都需要服务器. php都是以.php结尾的文件 Html文件里不能写php代码,但是ph ...

  9. 【简问】一些个人不会的问题,收到解答经核实OK的会在下方附注答案

    1.p标签内放行内块(如,input)适宜么(已知p是块元素,但p内不宜放置div)? 2.如何单独设置文字下划线颜色? 3.行内元素可以定位吗? 4.支持 margin:0 auto; 的元素类型有 ...

  10. Servlet--HttpServlet

    一.Servlet 接口(javax.servlet) 定义:     public interface Servlet      Implemented by: FacesServlet, Gene ...