DRF-视图类组件
补充
GET
books-------->查看数据--------------------> 返回所有数据列表 :[{},{},{}]
POST
books-------->添加数据--------------------->返回添加数据 :{}
PUT
books/1------->更新pk=1的数据--------------->返回更新后的数据: {}
Delete
books/1-------> 删除pk=1的数据-------------->返回空
GET
books/1------->查看单条数据 --------------->返回查看的单条数据 {}
普通版
缺点:缺点再实际工作中我们可能建多个表,导致代码过于冗余,所以我们要进行进一步封装。
from django.shortcuts import render,HttpResponse from django.views import View
# Create your views here.
# 导入djangorestframework
# 当前访问视图类下设置解析方式
from rest_framework.parsers import JSONParser
from rest_framework.views import APIView
from app01.models import *
from rest_framework import serializers
from rest_framework.response import Response class BookSerializer(serializers.ModelSerializer):
class Meta:
model=Book
# fields=["title","price"]
fields="__all__" def get_authors(self,obj):
ret=[]
for i in obj.authors.all():
ret.append(i.name)
return ret class LoginView(APIView):
parser_classes = [JSONParser]
def get(self,request):
book_list = Book.objects.all()
serializer = BookSerializer(book_list,many=True)
return Response(serializer.data)
def post(self,request):
print('body',request.body)
print(request.data)
print('data',request.data)
return HttpResponse('OK') class SLoginView(APIView):
def get(self,request,id):
my_obj = Book.objects.get(pk=id)
serializer = BookSerializer(my_obj, many=False)
return Response(serializer.data)
pass
def put(self,request,id):
my_obj = Book.objects.get(pk=id)
serializer = BookSerializer(data=request.data,instance=my_obj)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
else:
return Response(serializer.errors)
def delete(self,request,id):
my_obj = Book.objects.get(pk=id).delete()
return Response("")
第一步封装---对里面的数据操作进行封装
url中
url(r'^authors/$', views.AuthorsView.as_view()),
url(r'^authors/(?P<pk>\d+)/', views.SAuthorsView.as_view()),
视图函数中
from rest_framework import generics from rest_framework.mixins import ListModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin,RetrieveModelMixin from rest_framework import generics class PublishView(ListModelMixin,CreateModelMixin,generics.GenericAPIView):
queryset = Publish.objects.all()
serializer_class = PublishSerializer 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 SPublishView(UpdateModelMixin,DestroyModelMixin,RetrieveModelMixin,generics.GenericAPIView): queryset = Publish.objects.all()
serializer_class = PublishSerializer 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)
第二步封装,对两个类中的方法进行封装,然后把两个视图合为一个视图再进行封装
url中
url(r'^authors/$', views.AuthorsView.as_view({"get":"list","post":"create"})),
url(r'^authors/(?P<pk>\d+)/', views.AuthorsView.as_view({"get":"retrieve","delete":"destroy","put":"update"})),
视图中
from rest_framework.viewsets import ModelViewSet class AuthorsView(ModelViewSet):
queryset = Author.objects.all()
serializer_class = AuthorSerializer
对封装后的视图类组件的源码解析
1 启动Django,执行AuthorsView.as_view 找继承最近的as_view
url(r'^authors/$', views.AuthorsView.as_view({"get":"list","post":"create"})),
url(r'^authors/(?P<pk>\d+)/', views.AuthorsView.as_view({"get":"retrieve","delete":"destroy","put":"update"})), 2 在AuthorsView,下找as_view方法
class AuthorsView(ModelViewSet):
queryset = Author.objects.all()
erializer_class = AuthorSerializer
没找到,去父类ModelViewSet下找 3 在ModelViewSet,下找as_view方法
class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):pass 没找到,去父类GenericViewSet下找
4 在GenericViewSet,下找as_view方法
class GenericViewSet(ViewSetMixin, generics.GenericAPIView):pass
没找到,去父类ViewSetMixin下找
//******找到我们要的as_view方法
5 在ViewSetMixin,下找as_view方法,我们找到了as_view()
class ViewSetMixin(object):
@classonlymethod
# *****这里我们把url中的as_view参数{"get":"retrieve","delete":"destroy","put":"update"}传给了actions,开始关注actions
def as_view(cls, actions=None, **initkwargs):
def view(request, *args, **kwargs):
for method, action in actions.items():
handler = getattr(self, action)
setattr(self, method, handler)
return self.dispatch(request, *args, **kwargs)
return csrf_exempt(view)
我们找到了as_view() 然后返回view
// ******这里开始浏览器请求数据
当浏览器访问时我们执行view()
handler = getattr(self, action) 我们得到self.retrieve 这个方法
setattr(self, method, handler) 我们self.get = self.retrieve 我们把方法赋给相应的请求
return self.dispatch(request, *args, **kwargs) 这里我们又回到APIview下的内容分发了
6 在APIview中的dispatch中
def dispatch(self, request, *args, **kwargs):
# *****进行内容分发,self.get,self.put...由于在步骤5我们又对他们进行了赋值,相当于self.retrieve,self.update...
handler = getattr(self, request.method.lower(),self.http_method_not_allowed)
# 这里执行函数retrieve().......
response = handler(request, *args, **kwargs)
return self.response
DRF-视图类组件的更多相关文章
- drf04 drf视图类
REST framework 提供了众多的通用视图基类与扩展类,以简化视图的编写. 1.2个视图基类 1.1. APIView rest_framework.views.APIView APIView ...
- 067.Python框架Django之DRF视图类
一 关于视图类的一下概念 drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作.所以在django原有的django.views.View类基础上,drf封装了多个子类出来提供给我们使用. ...
- drf视图类总结

- drf视图组件、认证组件
视图组件 1.基本视图 url(r'^publish/$', views.PublishView.as_view()), url(r'^publish/(?P<pk>\d+)/$', vi ...
- DRF之视图类(mixin)源码解析
同样的增删改查操作,如果我们还像之前序列化组件那样做,代码重复率过多,所以我们用视图表示: 具体源码实现:首先定义一个视图类,然后根据mixin点进去有五个封装好的方法,这五个方法共有的属性就是都需 ...
- DRF 视图组件,路由组件
视图组件 -- 第一次封装 -- GenericAPIView(APIView): queryset = None serializer_class = None def ge ...
- DRF视图组件
DRF视图组件: CVB模式继承----五层 from django.views import View # Django的View from rest_framework.views import ...
- DRF 视图组件
目录 DRF 视图组件 视图组件大纲 两个视图基本类 五个扩展类 九个子类视图 视图集 常用视图集父类 魔法类 一览表 DRF中视图的"七十二变" 第一层:基于APIview的五个 ...
- drf03 drf视图中提供的请求类和响应类
drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作.所以在django原有的django.views.View类基础上,drf封装了多个子类出来提供给我们使用. Django REST ...
随机推荐
- SSM集成
SSM集成 Spring和各个框架的整合 Spring目前是JavaWeb开发中最终的框架,提供一站式服务,可以其他各个框架整合集成 Spring整合方案 SSH Ssh是早期的一种整 ...
- Codeforces 1249 D2. Too Many Segments (hard version)
传送门 贪心 对于第一个不合法的位置,我们显然要通过删除几个覆盖了它的区间来使这个位置合法 显然删右端点更靠右的区间是更优的,所以就考虑优先删右端点靠右的,然后再考虑下一个不合法位置 用一个 $set ...
- static的用法详解
一.静态类 [1] 仅包含静态成员. [2] 静态类的本质,是一个抽象的密封类,所以不能被继承,也不能被实例化.也就是说,不能使用 new 关键字创建静态类类型的变量. [4] 不能包含实例构造函数. ...
- ZROI17普及23-B星空题解--图的灵活转化
题目链接 版权原因不予提供 分析 这题思路很妙啊,虽然已经算半个套路题(因为我太菜了) 将框视为点,若一个球能放在\(x\)或\(y\)框,则\(x,y\)连一条无向边.有一条非常显然的性质是:在联通 ...
- js之向div contenteditable光标位置添加字符
js之向div contenteditable光标位置添加字符 原理: 在HTML里面,光标是一个对象,光标对象是只有当你选中某个元素的时候才会出现的. 当我们去点击一个输入框的时候,实际上它会产生 ...
- List、Set、Map集合的遍历方法
一.List集合遍历 public class TraversingList { /** * @author zhuxun describe: 定一个List集合并遍历 */ /** 定义一个List ...
- MYSQL查询练习 1
-- 查询练习 1------------ CREATE TABLE stu ( sid ), sname ), age INT, gender ) ); , 'male'); , 'female') ...
- insert buffer/change buffer double write buffer,双写 adaptive hash index(AHI) innodb的crash recovery innodb重要参数 innodb监控
https://yq.aliyun.com/articles/41000 http://blog.itpub.net/22664653/viewspace-1163838/ http://www.cn ...
- 操作系统 (OS)
1. 操作系统(Operation System,OS) 操作系统作为接口的示意图 没有安装操作系统的计算机,通常被称为 裸机 如果想在 裸机 上运行自己所编写的程序,就必须用机器语言书写程序 如果计 ...
- TSN(Temporal Segment Networks)
一.算法详解 二.代码解析(pytorch版) 训练代码:https://blog.csdn.net/u014380165/article/details/79058147 测试代码:https:// ...