django---APIView源码分析

前言:APIView基于View 看这部分内容一定要懂django—CBV里的内容

django—CBV源码分析中,我们是分析的from django.views import View下的执行流程

这篇博客我们就来了解下APIView是如何执行的,跟django.views模块下的view有何关联?

我们依然从urls.py配置入手分析

from django.conf.urls import url
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^publishes/', views.PublishView.as_view()),
]

views.py

from rest_framework.views import  APIView

class PublishView(APIView):

    def get(self,request):
publish_list=Publish.objects.all()
ret=serialize("json",publish_list) return HttpResponse(ret) def post(self,request):
pass

1、首先我们还是来确认urls.pyas_view是谁执行的?

首先我们去views.PublishView中找,发现找不到,所以我们接着再去PublishView的父类APIView中去找,找到了所以执行调用APIView.as_view(),内容如下:

class APIView(View):

    # 多余的代码暂且删掉了
@classmethod
def as_view(cls, **initkwargs):
if isinstance(getattr(cls, 'queryset', None), models.query.QuerySet):
def force_evaluation():
raise RuntimeError(
'Do not evaluate the `.queryset` attribute directly, '
'as the result will be cached and reused between requests. '
'Use `.all()` or call `.get_queryset()` instead.'
)
cls.queryset._fetch_all = force_evaluation # 1. super调用父类的as_view的执行结果赋值给view这个变量
view = super(APIView, cls).as_view(**initkwargs)
view.cls = cls
view.initkwargs = initkwargs # Note: session based authentication is explicitly CSRF validated,
# all other authentication is CSRF exempt. # csrf_exempt 不在执行调用csrf_token那个中间件
# 中间件是针对全局的
# 2. 这里返回的view就是父类View.view
return csrf_exempt(view)

2、大家是不是以为这样就结束了?NO!NO!NO!

如果是as_view是View的as_view,dispatch是View的dispatch,那rest-framework不就成废钞了么?

as_view的执行结果是dispatch的执行结果,那么dispatch还是View的dispatch么?

  1. 我们先看下views.PublishView里边有没有dispatch,发现没有
  2. 我们在views.PublishView的父类APIView,发现有
  3. 所以dispatch是APIView.dispatch非View.dispatch
  4. APIView.dispatch 里边有一堆组件,这里不说

中间的这点代码跟之前的View.dispatch一样:

还是做请求分发,在请求之外又做了一堆事情

    if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(),
self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed response = handler(request, *args, **kwargs)

总结:

url 转变过程

  1. url(r'^publishes/', views.PublishView.as_view()),
  2. url(r'^publishes/', APIView.as_view()),
  3. url(r'^publishes/', View.as_view()),

View.as_view()我们在django—CBV讲解过了

所以最后调用还是,只是APIView.as_view在里边加了一些他自己定义的一些东西,只是我们没用到而已

APIView.as_view()---> View.as_view()---> APIView.dispatch()--->response--->handler()--> 自己定义请求方法函数的返回结果,否则就抛错405

django---APIView源码分析的更多相关文章

  1. $Django cbv源码分析 djangorestframework框架之APIView源码分析

    1 CBV的源码分析 #视图 class login (View): pass #路由 url(r'^books/$', views.login.as_view()) #阅读源码: #左侧工程栏--- ...

  2. django Rest Framework----APIView 执行流程 APIView 源码分析

    在django—CBV源码分析中,我们是分析的from django.views import View下的执行流程,这篇博客我们介绍django Rest Framework下的APIView的源码 ...

  3. Django rest framework框架——APIview源码分析

    一.什么是rest REST其实是一种组织Web服务的架构,而并不是我们想象的那样是实现Web服务的一种新的技术,更没有要求一定要使用HTTP.其目标是为了创建具有良好扩展性的分布式系统. 可用一句话 ...

  4. CBV源码分析+APIVIew源码分析

    {drf,resful,apiview,序列化组件,视图组件,认证组件,权限组件,频率组件,解析器,分页器,响应器,URL控制器,版本控制} 一.CBV源码分析准备工作: 新建一个Django项目 写 ...

  5. Restful规范-APIView源码分析

    目录 一.Restful规范 十条规范 二.drf的简单使用 三.APIView源码分析 CBV源码分析 APIView源码分析 一.Restful规范 Restful规范是一种web API接口的设 ...

  6. cbv+resful+APIView源码分析

    CBV源码分析 1概念:什么是cbv和fbv 已经什么是API class bass View ---基于类的视图 function bass View ---基于函数的视图 API(Applicat ...

  7. 探索drf执行流程之APIView源码分析

    Django REST framework 简介 现在新一代web应用都开始采用前后端分离的方式来进行,淘汰了以前的服务器端渲染的方式.而实现前后端分离是通过Django REST framework ...

  8. Django APIView源码解析

    APIView使用:luffy项目中关于APIView的使用 在Django之 CBV和FBV中,我们是分析的from django.views import View下的执行流程,以下是代码 fro ...

  9. drf的基本使用、APIView源码分析和CBV源码拓展

    cbv源码拓展 扩展,如果我在Book视图类中重写dispatch方法 -可以实现,在get,post方法执行之前或者之后执行代码,完成类似装饰器的效果 def dispatch(self, requ ...

  10. django --- DetailView源码分析

    [背景] 最近在看django官方文档的class-based-views这一节的时候一直不得要领,感觉自己清楚,但是回想起来又没有脉络:于是没有办法只 能是“暗中观察”django的源码了. 刚打开 ...

随机推荐

  1. Linux mount 命令

    mount 命令用来挂载文件系统.其基本命令格式为:mount -t type [-o options] device dirdevice:指定要挂载的设备,比如磁盘.光驱等.dir:指定把文件系统挂 ...

  2. Visual Studio 2013版本安装

    这周老师布置了关于Visual Studio 2013版本安装过程的概述,下面我就分享给大家看吧! 首先要下载安装文件,等待下载完成之后,虽然下载文件是ios格式,但我们可以用解压缩工具解压打开.解压 ...

  3. Scrum Meeting day 4

                第四次会议 No_00:工作情况 No_01:任务说明 待完成 已完成 No_10:燃尽图 No_11:照片记录 待更新 No_100:代码/文档签入记录 No_101:出席表 ...

  4. Linux内核分析 笔记五 扒开系统调用的三层皮(下) ——by王玥

    (一)给MenuOs增加time和time-asm命令 更新menu代码到最新版 在main函数中增加MenuConfig 增加对应的Ttime和TimeAsm函数 make rootfs (二)使用 ...

  5. 小学四则运算APP 第一个冲刺阶段 第六天

    团队成员:陈淑筠.杨家安.陈曦 团队选题:小学四则运算APP 第一次冲刺阶段时间:11.17~11.27 本次发布的是重新排列整齐ResultActivity的布局代码activity_result. ...

  6. 在web.xml中配置监听器来控制ioc容器生命周期

    5.整合关键-在web.xml中配置监听器来控制ioc容器生命周期 原因: 1.配置的组件太多,需保障单实例 2.项目停止后,ioc容器也需要关掉,降低对内存资源的占用. 项目启动创建容器,项目停止销 ...

  7. [读书笔记]Linux命令行与shell编程读书笔记02 环境变量以及其他

    1. Linux的环境变量. 全局环境变量的查看 printenv 一个结果示例 XDG_SESSION_ID=354TERM=xtermSHELL=/bin/bashSSH_CLIENT=10.24 ...

  8. ionic动态切换主题皮肤

    本来想通过css自定义属性值: :root{ --red:red; } p{ color:var(--red); } div{ background:var(--red); } 在ionic2设置动态 ...

  9. 软件工程_1st weeks

    本周为软件工程课的第一周,本周主要完成了三个工作:了解了github并使用.拜读了<构建之法>并开通了博客以及完成了四则运算的代码实现. 对于第一项工作github的安装和使用,花费了5个 ...

  10. jquery Ajax get()/post()

    get()/post()是通過http get/post向服務器請求數據的. http get vs post: get:向指定資源獲取數據 post項指定資源提交數據. get是向遠程服務器的獲取數 ...