Python 基于类视图的django事务管理

Python 基于类视图的django事务管理,python,django,Python,Django,我有一个基于类的视图,它有如下方法post class Comment(View): def dispatch(self, request, *args, **kwargs): super(Comment, self).dispatch(request, *args, **kwargs) @method_decorator(transaction.non_atomic_requests) def post(self, request, *args, *

我有一个基于类的视图,它有如下方法post

class Comment(View):

    def dispatch(self, request, *args, **kwargs):
        super(Comment, self).dispatch(request, *args, **kwargs)

    @method_decorator(transaction.non_atomic_requests)
    def post(self, request, *args, **kwargs):
        <Some code>
类注释(视图):
def调度(自我、请求、*args、**kwargs):
超级(评论,自我)。发送(请求,*args,**kwargs)
@方法装饰器(事务。非原子请求)
def post(自我、请求、*args、**kwargs):
在上面的示例中,transaction.non_atomic_请求不会使post方法成为非原子的,但若我对dispatch方法使用相同的装饰器,那个么它会工作吗?为什么?


根据django文档,我正在使用django 1.9

要修饰基于类的视图的每个实例,需要修饰类定义本身。为此,需要将decorator应用于类的dispatch()方法

dispatch是处理视图请求的第一个方法。

使用装饰器时,它会在装饰对象上设置属性
\u非原子请求

Django然后在视图运行时检查
\u non\u atomic\u requests
属性

当Django运行基于类的视图时,它不会直接运行
dispatch
方法,而是运行
as\u view()
方法返回的视图

as_view()
方法中有一个代码,它将
非原子请求等属性从
分派
方法复制到返回的视图中

但是,
as_view
方法不会从任何其他方法(如
get
post
)复制属性。装饰
post
方法时,
\u non\u atomic\u requests
属性不会复制到视图中,因此装饰器不起作用


因此,您必须将诸如
transaction.non_-atomic\u requests
csrf\u employ
之类的修饰符应用于
dispatch
方法。

非常感谢@Alasdair。你解释得很好。我缺少要考虑的as_view()方法。再次感谢。