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)分析线上故障(一) - 视图&功能篇 使 ...
随机推荐
- Codecraft-17 and Codeforces Round #391 (Div. 1 + Div. 2, combined) A
Bash wants to become a Pokemon master one day. Although he liked a lot of Pokemon, he has always bee ...
- 网页抓取解析,使用JQuery选择器进行网页解析
最近开发一个小功能,数据库中一个基础表的数据从另一个网站采集. 因为网站的数据不定时更新,需要更新后自动采集最新的内容. 怎么判断更新数据没有? 好在网站有一个更新日志提示的地方,只需要对比本地保留的 ...
- C# Mutex互斥锁
Mutex 构造函数 (Boolean, String, Boolean) public Mutex ( bool initiallyOwned, string name, out bool crea ...
- 洛谷P1081 开车旅行70分
https://www.luogu.org/problem/show?pid=1081 太遗憾了明明写出来了,却把最小值初始值弄小了,从第二个点开始就不可能对了.70分! #include<io ...
- 重写FileUpload控件让它可以显示上传后的文件名
我在以前的开发中经常遇到这样的场景:文件上传之后需要显示文件名,但是asp.net自带的fileupload是不能付给上传后的文件名值的. 以前都是做一个label显示的,今天想起来了,写个控件封装一 ...
- (转)在Unity3D中控制动画播放
用Unity3D也算是好久了,但是每次做项目总还是能学到新的东西.这次做一个TPS的项目就遇到了这样一个问题,如何同时在上下半身播放不同的动画?解决方法其实是很简单,但由于对于动画资源的了解不足导致问 ...
- iOS 面试常问之多线程
本片围绕多线程全面展开叙述. 1.为什么要有多线程/多线程是用来干什么的? 2.多线程是什么? 3.如何创建多线程? 4.多线程在哪些情况下会使用/多线程使用场景? 5.三种多线程的优缺点? 6.线程 ...
- 读取jar包内的文件内容
package com.chanpion.boot; import org.springframework.util.ResourceUtils; import java.io.File; impor ...
- Python+selenium之fixtures
fixtures即可以表示测试用例的开始和结束,也可以表示测试类和测试模块的开始和结束. import unittest def setUpModule(): print("test mod ...
- C#调用SAP S4/HANA Gateway Service
公司使用SAP,并且实施公司做了一些提供报表数据的接口供调用,首先说明一下我对SAP不熟悉 但SAP用到的接口信息提供大家参考一下,这些Gateway Service使用的是DCP方式写的,SAP提供 ...