Django:基于 class 的视图中的装饰器

Django: decorator in class based view

我想限制对特定视图的访问,以便只接受 AJAX 个请求,因此我实现了以下装饰器:

def require_ajax(func):
    def decorator(func):
        def inner(request, *args, **kwargs):
            if not request.is_ajax():
                return HttpResponseBadRequest()
            return func(request, *args, **kwargs)
        return inner

    return decorator

这在函数视图中完美运行,但我不知道如何在基于 class 的视图中使用它。我试过 this 但出现错误,我想是因为我使用的是旧版本的 Django。

好吧,我基于 class 的观点:

class AjaxView(TemplateView):
  template_name = '...'

  def get_context_data(self, **kwargs):
    ...
    return context

  @method_decorator(require_ajax)
  def dispatch(self, *args, **kwargs):
      return super(AjaxView, self).dispatch(*args, **kwargs)

以不同方式实现装饰器解决了问题:

def require_ajax(func):
    def decorator(request, *args, **kwargs):
        if not request.is_ajax():
            return HttpResponseBadRequest()
        return func(request, *args, **kwargs)

    return decorator