【问题标题】:Django: decorator in class based viewDjango:基于类的视图中的装饰器
【发布时间】:2017-03-08 18:32:41
【问题描述】:

我想限制对特定视图的访问,以便只接受 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

这在函数视图中非常有效,但我不知道如何在基于类的视图中使用它。我已经尝试过this,但出现了错误,我认为是由于我使用的是旧版本的 Django。

好吧,我的基于类的视图:

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)

【问题讨论】:

  • 究竟是什么错误?在不知道问题的情况下无法很好地帮助您。使用 method_decorator 是一种不错的方法,但是您可能需要查看 Django 1.4 中该方法的文档。 django.readthedocs.io/en/1.4/topics/…
  • 你需要为 CBV 做一个 mixin - 同样的方式 login_requiredLoginRequiredMixin 工作
  • @makaveli 错误只是关于 kwargs,它说有意外的 kwargs(我在 get_context_data 中使用)。
  • @Sayse 你能详细说明一下吗?
  • Source for LRM - 本质上,您可以将您的装饰器应用于每个需要它的视图的dispatch 方法,或者制作一个类似于此的mixin,然后它只是class AjaxView(MyMixin, TemplateView)

标签: python django python-2.7 python-decorators django-1.4


【解决方案1】:

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

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

    return decorator

【讨论】:

    猜你喜欢
    • 2020-07-07
    • 2014-10-20
    • 2014-01-21
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 2012-06-11
    相关资源
    最近更新 更多