Django中as_view方法的cls和initkwargs是如何传递给view函数的?
Django类视图as_view参数获取逻辑解答
你看到的self = cls(**initkwargs)这行代码里的两个参数,本质是利用了Python的类方法特性和闭包特性传递的,具体逻辑如下:
cls来源:as_view是视图类的类方法,按照Python类方法的规则,调用类方法时第一个参数会自动绑定为当前类本身,你在urls.py里写MyView.as_view()的时候,as_view拿到的第一个参数就是MyView类,也就是代码里的cls。initkwargs来源:就是你调用as_view()时传入的自定义关键字参数,比如MyView.as_view(page_size=10, allow_guest=True)里的page_size、allow_guest这类参数都会被收集到initkwargs字典里。- 内层
view函数获取这两个参数的逻辑:view是定义在as_view内部的嵌套函数(闭包),天然可以访问外层as_view函数作用域里的所有变量,不需要额外传参,哪怕as_view执行完把view返回出去之后,view依然能保留当时拿到的cls和initkwargs值。
你可以参考简化版的as_view实现逻辑理解:
class View: @classmethod def as_view(cls, **initkwargs): # 对传入的initkwargs做合法性校验等前置逻辑 def view(request, *args, **kwargs): # 直接使用外层作用域的cls和initkwargs实例化类 self = cls(**initkwargs) self.setup(request, *args, **kwargs) return self.dispatch(request, *args, **kwargs) return view

内容的提问来源于stack exchange,提问作者Santhosh
相关产品推荐
相关产品推荐

