Django中as_view()返回view函数而非调用它的语法疑问
为什么Django CBV的as_view返回
view而非view()? 这问题问得很戳点,我刚接触CBV的时候也卡过这个弯,咱们拆开说清楚:
URL配置要的是「可调用对象」,不是执行结果
Django的路由系统在匹配请求时,需要的是一个能被调用的实体(比如函数、或实现了__call__方法的对象),而不是某个函数执行后直接返回的HTTP响应。如果as_view返回view(),那在Django启动加载URL配置的瞬间,就会直接执行view函数生成响应——这完全偏离了需求,我们要的是等请求真正到来时,再触发处理逻辑并返回响应,而不是提前把响应备好。as_view的核心是「把类视图转换成可调用入口」
你看源码里的view函数,它才是处理请求的实际入口:当请求匹配到对应URL时,Django会调用这个view函数,它内部会完成类视图实例化、调用dispatch分发请求、路由到get/post等具体方法的流程。如果as_view返回view(),相当于提前执行了这一套操作,而且所有请求会共用同一个类实例,彻底打破了CBV「每个请求独立实例化」的设计初衷,会引发各种状态混乱的问题。换个最直白的类比:
写函数视图时,你肯定是在URL里写path('demo', my_view)而非path('demo', my_view()),对吧?前者是把函数本身交给路由,等请求来的时候再调用;后者是直接执行函数,把返回的响应塞给路由——这显然不是我们要的效果。as_view返回的view就和这个my_view函数一样,是一个等待请求触发的「可调用入口」。
内容的提问来源于stack exchange,提问作者William Karlsson
相关产品推荐
相关产品推荐

