Python 基于类视图的django事务管理
我有一个基于类的视图,它有如下方法postPython 基于类视图的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, *
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()方法。再次感谢。