典型FBV视图例子

url路由系统

from django.conf.urls import url
from django.contrib import admin
from luffycity.views import BookView, AuthorView, PublisherView urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^book/', BookView.as_view()),
url(r'^author/', AuthorView.as_view()),
url(r'^publisher/', PublisherView.as_view()),
]

可以看到url系统拿到url后就去执行了视图函数的as_view()方法,那么这个方法到底做了什么事,我们先来看视图编写部分

视图系统

class BookView(views.View):
def get(self,request):
ret = Book.objects.all().values('title', 'publisher__name', 'author__name')
l = {}
for index, i in enumerate(ret):
l[index] = i
print(index,i)
return JsonResponse(l) class PublisherView(views.View):
def get(self,request):
ret = Publisher.objects.all().values('name','address')
print(ret)
l = {}
for i, index in enumerate(ret):
l[i] = index
return JsonResponse(l) class AuthorView(views.View):
def get(self,request):
ret = Author.objects.values('name','country','age')
l = {}
for i, index in enumerate(ret):
l[i] = index
print(l)
return JsonResponse(l)

大家知道,我们编写的CBV的视图类中是没有as_view方法的,所以as_view肯定是我们视图类继承的view.View类中的方法,我们接下来分析下源码

View源码分析

我们进去view源码看看

找到as_view方法

    def as_view(cls, **initkwargs):
"""
Main entry point for a request-response process.
"""
for key in initkwargs:
if key in cls.http_method_names:
raise TypeError("You tried to pass in the %s method name as a "
"keyword argument to %s(). Don't do that."
% (key, cls.__name__))
if not hasattr(cls, key):
raise TypeError("%s() received an invalid keyword %r. as_view "
"only accepts arguments that are already "
"attributes of the class." % (cls.__name__, key)) def view(request, *args, **kwargs):
self = cls(**initkwargs)
if hasattr(self, 'get') and not hasattr(self, 'head'):
self.head = self.get
self.request = request
self.args = args
self.kwargs = kwargs
return self.dispatch(request, *args, **kwargs)
view.view_class = cls
view.view_initkwargs = initkwargs # take name and docstring from class
update_wrapper(view, cls, updated=()) # and possible attributes set by decorators
# like csrf_exempt from dispatch
update_wrapper(view, cls.dispatch, assigned=())
return view

注意as_view返回了view方法,而路由系统是会执行这个view方法

        def view(request, *args, **kwargs):
self = cls(**initkwargs)
if hasattr(self, 'get') and not hasattr(self, 'head'):
self.head = self.get
self.request = request
self.args = args
self.kwargs = kwargs
return self.dispatch(request, *args, **kwargs)

view 返回了一个self.dispatch(request, *args, **kwargs),在看看这个方法做了什么

    def dispatch(self, request, *args, **kwargs):
# Try to dispatch to the right method; if a method doesn't exist,
# defer to the error handler. Also defer to the error handler if the
# request method isn't on the approved list.
// 判断请求的方法是否在http_method_names中http_method_names是包含允许请求方式的八大请求
if request.method.lower() in self.http_method_names:
// 然后判断类视图中是否有请求对应的方法例如get,否则执行报错
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)

总结

CBV源码步骤:

1、执行as_view方法,返回一个view函数,

2、路由系统会执行view函数,会调用dispatch函数

3、dispatch函数会根据requesrt.method请求的方法判断请求是否合理

4、请求合理后会去判断请求对应的方法是否在视图函数类中

5、执行相应的视图函数类的方法,例如请求方式为get,那么dispatch方法的返回就会执行视图的get方法

django CBV视图源码分析的更多相关文章

  1. Django之CBV视图源码分析(工作原理)

    1.首先我们先在urls.py定义CBV的路由匹配. FBV的路由匹配: 2.然后,在views.py创建一名为MyReg的类: 注意:该类必须继续View类,且方法名必须与请求方式相同(后面会详解) ...

  2. Django搭建及源码分析(三)---+uWSGI+nginx

    每个框架或者应用都是为了解决某些问题才出现旦生的,没有一个事物是可以解决所有问题的.如果觉得某个框架或者应用使用很不方便,那么很有可能就是你没有将其使用到正确的地方,没有按开发者的设计初衷来使用它,当 ...

  3. Django如何启动源码分析

    Django如何启动源码分析 启动 我们启动Django是通过python manage.py runsever的命令 解决 这句话就是执行manage.py文件,并在命令行发送一个runsever字 ...

  4. Django之DRF源码分析(二)---数据校验部分

    Django之DRF源码分析(二)---数据校验部分 is_valid() 源码 def is_valid(self, raise_exception=False): assert not hasat ...

  5. Django——基于类的视图源码分析 二

    源码分析 抽象类和常用视图(base.py) 这个文件包含视图的顶级抽象类(View),基于模板的工具类(TemplateResponseMixin),模板视图(TemplateView)和重定向视图 ...

  6. Django 之restfromwork 源码分析以及使用之--视图组件

    restframework 源码分析以及使用 mixins 中的五种类方法 from rest_framework import mixins # mixins 中一种有五种类 # 第一种:用户保存数 ...

  7. django 之(二) --- 源码分析

    CBV类视图继承 CBV:继承自View:注册的时候使用的as_view() 入口 不能使用请求方法的名字作为参数的名字 只能接受已经存在的属性对应的参数 定义了一个view 创建了一个类视图对象 保 ...

  8. Django rest framework源码分析(1)----认证

    目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...

  9. Django rest framework 源码分析 (1)----认证

    一.基础 django 2.0官方文档 https://docs.djangoproject.com/en/2.0/ 安装 pip3 install djangorestframework 假如我们想 ...

随机推荐

  1. 启动mysql服务,报错1067,进程意外终止

    之前一直使用的是oracle,这次换成mysql,在配置my.ini的时候,添加default-character-set=utf8,来修改字符集. 修改完成之后,启动mysql的服务,但是报错,10 ...

  2. Ubuntu18.04安装Tensorflow

    1.Ubuntu安装Python3.6: 首先拉取远程仓库 sudo add-apt-repository ppa:jonathonf/python-3.6 更新源 sudo apt-get upda ...

  3. [Spark][Flume]Flume 启动例子

    Flume 启动例子: flume-ng agent --conf /etc/flume-ng/conf --conf-file /etc/flume-ng/conf/flume.conf --nam ...

  4. Item 17: 理解特殊成员函数的生成规则

    本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 C++的官方说法中,特殊成员函数是C++愿意去主动生成的.C++9 ...

  5. C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 严格的用户账户审核功能

    整个集团有几万个用户,一个个用户添加是不现实的,只有每个公司的系统管理员添加.或者用户申请帐户,然后有相应的管理员审核,才会更准确一些. 每个公司.分公司.部门的账户情况只有所在公司的管理员是最清楚的 ...

  6. python二:数据类型举例练习--小白博客

    一.#字符串 res = 'hello,world' 1.#字符串切片取值:******* print(res[0:5]) 顾头不顾尾,取下标0-4的字符 print(res[0:-1:2]) 步长为 ...

  7. RestTemplete

    RestTemplete是由spring提供的,可以用来模拟浏览器进行服务调用的封装好的Api,和Apache 的HttpClient功能相同,在分布式系统中可以用来服务之间的调用. 开发步骤: 1. ...

  8. Linux查看硬件等基本参数

    http://www.cnblogs.com/xd502djj/archive/2011/02/28/1967350.html

  9. java中的标记接口(标签接口)

    Java中的标记接口(Marker Interface),又称标签接口(Tag Interface),具体是不包含任何方法的接口.在Java中很容易找到标记接口的例子,比如JDK中的Serialzab ...

  10. Oracle 同义词(Synonym)

    同义词(Synonym)是表.索引.视图等模式对象的一个别名.通过模式对象创建同义词,可以隐藏对象的实际名称和所有者信息,隐藏分布式数据库中远程对象的设置信息,由此为对象提提供一定的安全性保证.同义词 ...