本文主要是介绍Django 视图探秘:FBV与CBV注册方式的异同,揭秘as_view()的执行魔法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 一、FBV、CBV注册方式及其区别
- FBV
- CBV
- 二、as_view()函数
- 查看对应的view函数具体内容,最终返回的是dispatch方法
- 查看dispatch方法
一、FBV、CBV注册方式及其区别
FBV
FBV:
path('index/',views.index)
通过调用函数方式,views.index是一个普通函数
路由分发,匹配到对应的路由后,会调用上面的index方法
CBV
CBV:
path('login/',LoginView.as_view())
通过继承Django的View类来实现
路由分发,匹配到对应的路由后,会调用上面的LoginView.as_view()方法,
二、as_view()函数
查看对应的view函数具体内容,最终返回的是dispatch方法
查看dispatch方法
图中翻译:
Try to dispatch to the right method; if a method doesn’t exist,the error handler. Also defer to the error handler if the request method isn’t on the approved list.
翻译:尽量用正确的方法调度;如果一个方法不存在,则返回错误处理程序。如果请求方法不在批准的列表中,也要服从错误处理程序。
图中代码解释:
request.method.lower()
就是把请求方式改成小写(例如get请求方式),request.method
就是请求方式,lower()
就是改成小写
http_method_names:
getattr() :
getattr()
函数在Python中用于从对象中获取指定属性的值。
语法是:getattr(对象, 属性, 默认值)
对象
是要从中获取属性值的对象。
属性
是要获取其值的属性的名称。
默认值(可选)
是在属性不存在时要返回的值(如果不提供,则会引发 AttributeError)。
所以这里代码的意思就是if判断
request.method.lower()
请求的方法在self.http_method_names:
里面的话,就执行 getattr方法,self就是我们一开始定义的LoginView类对象,所以这里的
handler =getattr( self, request.method.lower(),self.http_method_not_allowed )
的意思就是(注意:假设这里请求的是get方式):把LoginView.get
(注意:不存在就会执行self.http_method_not_allowed
方法)赋值给handler
,最后通过
return handler(request, *args, **kwargs)
返回并且执行LoginView.get
方法,刚开始赋值给handler
的时候并没有执行.get方法,是最后return handler(request, *args, **kwargs)
相当于LoginView.get+()
加了个括号才算是执行的这个方法
这篇关于Django 视图探秘:FBV与CBV注册方式的异同,揭秘as_view()的执行魔法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!