django---APIView源码分析
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.py中as_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么?
- 我们先看下views.PublishView里边有没有dispatch,发现没有
- 我们在views.PublishView的父类APIView,发现有
- 所以dispatch是APIView.dispatch非View.dispatch
- 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 转变过程
- url(r'^publishes/', views.PublishView.as_view()),
- url(r'^publishes/', APIView.as_view()),
- 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源码分析的更多相关文章
- $Django cbv源码分析 djangorestframework框架之APIView源码分析
1 CBV的源码分析 #视图 class login (View): pass #路由 url(r'^books/$', views.login.as_view()) #阅读源码: #左侧工程栏--- ...
- django Rest Framework----APIView 执行流程 APIView 源码分析
在django—CBV源码分析中,我们是分析的from django.views import View下的执行流程,这篇博客我们介绍django Rest Framework下的APIView的源码 ...
- Django rest framework框架——APIview源码分析
一.什么是rest REST其实是一种组织Web服务的架构,而并不是我们想象的那样是实现Web服务的一种新的技术,更没有要求一定要使用HTTP.其目标是为了创建具有良好扩展性的分布式系统. 可用一句话 ...
- CBV源码分析+APIVIew源码分析
{drf,resful,apiview,序列化组件,视图组件,认证组件,权限组件,频率组件,解析器,分页器,响应器,URL控制器,版本控制} 一.CBV源码分析准备工作: 新建一个Django项目 写 ...
- Restful规范-APIView源码分析
目录 一.Restful规范 十条规范 二.drf的简单使用 三.APIView源码分析 CBV源码分析 APIView源码分析 一.Restful规范 Restful规范是一种web API接口的设 ...
- cbv+resful+APIView源码分析
CBV源码分析 1概念:什么是cbv和fbv 已经什么是API class bass View ---基于类的视图 function bass View ---基于函数的视图 API(Applicat ...
- 探索drf执行流程之APIView源码分析
Django REST framework 简介 现在新一代web应用都开始采用前后端分离的方式来进行,淘汰了以前的服务器端渲染的方式.而实现前后端分离是通过Django REST framework ...
- Django APIView源码解析
APIView使用:luffy项目中关于APIView的使用 在Django之 CBV和FBV中,我们是分析的from django.views import View下的执行流程,以下是代码 fro ...
- drf的基本使用、APIView源码分析和CBV源码拓展
cbv源码拓展 扩展,如果我在Book视图类中重写dispatch方法 -可以实现,在get,post方法执行之前或者之后执行代码,完成类似装饰器的效果 def dispatch(self, requ ...
- django --- DetailView源码分析
[背景] 最近在看django官方文档的class-based-views这一节的时候一直不得要领,感觉自己清楚,但是回想起来又没有脉络:于是没有办法只 能是“暗中观察”django的源码了. 刚打开 ...
随机推荐
- Nginx---应用场景小结
Nginx介绍 Nginx一是一款轻量级的.高性能的HTTP.反向代理服务器,具有很高的稳定性.支持热部署.模块扩展也非常容易.Nginx采取了分阶段资源分配技术,处理静态文件和无缓存的反向代理加 ...
- 分布式监控系统Zabbix-完整安装记录 -添加端口监控
对于进程和端口的监控,可以使用zabbix自带的key进行监控,只需要在server端维护就可以了,相比于nagios使用插件去监控的方式更为简单.下面简单介绍配置:监控端口zabbix监控端口使用如 ...
- Centos下PPTP环境部署记录
PPTP(点到点隧道协议)是一种用于让远程用户拨号连接到本地的ISP,通过因特网安全远程访问公司资源的新型技术.它能将PPP(点到点协议)帧封装成IP数据包,以便能够在基于IP的互联网上进行传输.PP ...
- MySQL高可用架构-MMM环境部署记录
MMM介绍MMM(Master-Master replication manager for MySQL)是一套支持双主故障切换和双主日常管理的脚本程序.MMM使用Perl语言开发,主要用来监控和管理 ...
- 【M2】软件工程终期总结报告——阅读作业
PhylabWeb——阅读作业 问题回顾 提问博客地址:http://www.cnblogs.com/kibbon/p/4831104.html 尚待解决的问题: Alpha/Beta,ZBB/RC阶 ...
- Linux内核分析第四周学习总结
朱国庆+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 扒开系统调用的三层皮 ...
- navicat有数据额结构同步
这个功能可能检查两个库的表结构异同,进行表结构构同步,可以生成同步语句. 比如在测试环境表中新增了字段,可以通过这个工具进行表结构同步.
- 构建之法--初识Git
该作业来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2103 GitHub地址:https://github.com/GVic ...
- nginx for Windows Known issues:path
http://nginx.org/en/docs/windows.html nginx/Windows uses the directory where it has been run as the ...
- JavaScript浏览器历史的语法小问题
https://www.w3schools.com/jsref/met_his_back.asp This is the same as clicking the "Back button& ...