使用基于类的视图进行django事务管理

时间:2017-06-16 18:26:00

标签: python django

我有一个基于类的视图,其方法发布如下

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

2 个答案:

答案 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方法不会复制getpost等任何其他方法的属性。当您装饰post方法时,_non_atomic_requests属性不会复制到视图中,因此装饰器不起作用。

因此,您必须将transaction.non_atomic_requestscsrf_exempt等装饰器应用于dispatch方法。

答案 1 :(得分:0)

根据django文档:

  

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

dispatch是处理视图请求的第一个方法。 https://docs.djangoproject.com/en/1.11/topics/class-based-views/intro/#decorating-the-class