补充

       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-视图类组件的更多相关文章

  1. drf04 drf视图类

    REST framework 提供了众多的通用视图基类与扩展类,以简化视图的编写. 1.2个视图基类 1.1. APIView rest_framework.views.APIView APIView ...

  2. 067.Python框架Django之DRF视图类

    一 关于视图类的一下概念 drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作.所以在django原有的django.views.View类基础上,drf封装了多个子类出来提供给我们使用. ...

  3. drf视图类总结

    ![image](https://img2022.cnblogs.com/blog/2608149/202204/2608149-20220401194236430-447848842.png)

  4. drf视图组件、认证组件

    视图组件 1.基本视图 url(r'^publish/$', views.PublishView.as_view()), url(r'^publish/(?P<pk>\d+)/$', vi ...

  5. DRF之视图类(mixin)源码解析

     同样的增删改查操作,如果我们还像之前序列化组件那样做,代码重复率过多,所以我们用视图表示: 具体源码实现:首先定义一个视图类,然后根据mixin点进去有五个封装好的方法,这五个方法共有的属性就是都需 ...

  6. DRF 视图组件,路由组件

    视图组件  -- 第一次封装   -- GenericAPIView(APIView):    queryset = None    serializer_class = None    def ge ...

  7. DRF视图组件

    DRF视图组件: CVB模式继承----五层 from django.views import View # Django的View from rest_framework.views import ...

  8. DRF 视图组件

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

  9. drf03 drf视图中提供的请求类和响应类

    drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作.所以在django原有的django.views.View类基础上,drf封装了多个子类出来提供给我们使用. Django REST ...

随机推荐

  1. PAT-1012 The Best Rank (25 分) 查询分数对应排名(包括并列)

    To evaluate the performance of our first year CS majored students, we consider their grades of three ...

  2. Node初始以及环境搭建(Node01)

    1. 相关概念 •什么是JavaScript? •一种遵守ECMAScript标准的脚本语言 •最初只能运行在浏览器端 •浏览器中的 JavaScript 可以做什么? •操作DOM:表单验证.动画 ...

  3. C++ DLL debug版本在其他PC上缺少依赖的处理方式

    1.正常情况提供给其他人的都是Release版本DLL 2.在需要提供Debug版本时,目标机器上可能会缺少环境,或者和生成DLL的环境不匹配导致DLL无法加载,提示DLL无法找到. 3.使用DLL依 ...

  4. 2.Java集合-ConcurrentHashMap实现原理及源码分析

    一.为何用ConcurrentHashMap 在并发编程中使用HashMap可能会导致死循环,而使用线程安全的HashTable效率又低下. 线程不安全的HashMap 在多线程环境下,使用HashM ...

  5. 安装habse

    1.下载zookeeper-3.4.5.tar.gz, hbase-0.98.6-hadoop2-bin.tar.gz 2.上传到master的 /usr/local/src/目录下,解压zookee ...

  6. Linux命令——cat、more、less、head、tail

    cat 一次显示整个文件 -n:显示行号 -b :和 -n 相似,只不过对于空白行不编号 -s:当遇到有连续两行以上的空白行,就代换为一行的空白行 -E显示换行符 [root@localhost ~] ...

  7. linux设置自动同步服务器时间

    最近遇到一个问题,由于两台服务器时间的问题,经常导致用户登录由于时间差问题而报错,再三百度,最后整理了一下修改linux定时同步的操作(本方法适用于有自己时间服务器,没有的只限于借鉴) 首先确认,我们 ...

  8. 浅谈sass与less区别优缺点

    Sass是一种动态样式语言,Sass语法的缩排语法,比Css比多出很多功能,如变量,嵌套,运算,继承,颜色处理,函数等,易于阅读.Cass的安装需要安装Ruby环境,是服务器端处理的,Less是需要引 ...

  9. B进制星球(多进制 高精加)

    https://www.luogu.org/problemnew/show/P1604 B(2<=B<=36)进制计数.编写实现B进制加法的程序. 输入输出格式 输入格式: 共3行第1行: ...

  10. Sonya and Exhibition

    http://codeforces.com/group/1EzrFFyOc0/contest/1004/problem/B #include<iostream> #include<c ...