我有一个基于类的视图,其方法发布如下
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>
在上面的示例中,transaction.non_atomic_requests不会使post方法非原子,但如果我使用相同的装饰器进行调度方法那么它有效吗?为什么呢?
我正在使用django 1.9
答案 0 :(得分:3)
当您使用transaction.non_atomic_requests
装饰器时,它会在装饰对象上设置属性_non_atomic_requests
。
Django然后在视图运行时检查_non_atomic_requests
属性。
当Django运行基于类的视图时,它不会直接运行dispatch
方法,它会运行as_view()
方法返回的视图。
as_view()
方法中的代码会将_non_atomic_requests
方法之类的dispatch
等属性复制到返回的视图中。
但是,as_view
方法不会复制get
或post
等任何其他方法的属性。当您装饰post
方法时,_non_atomic_requests
属性不会复制到视图中,因此装饰器不起作用。
因此,您必须将transaction.non_atomic_requests
或csrf_exempt
等装饰器应用于dispatch
方法。
答案 1 :(得分:0)
根据django文档:
要装饰基于类的视图的每个实例,您需要装饰类定义本身。为此,您可以将装饰器应用于类的dispatch()方法。
dispatch是处理视图请求的第一个方法。 https://docs.djangoproject.com/en/1.11/topics/class-based-views/intro/#decorating-the-class