【问题标题】:Django - Custom decorator to allow only ajax requestDjango - 自定义装饰器只允许 ajax 请求
【发布时间】:2016-03-13 04:44:04
【问题描述】:

我的项目中只有很少的视图仅由 ajax 调用,我需要检查仅当请求是 ajax 时才处理视图。所以我想写一个装饰器。在寻找类似类型的装饰器时,我遇到了几个但什么都不懂。 我使用基于类的视图,并将在 get/post 方法上使用这个装饰器。我确实发现了一些 sn-ps,但都是为基于函数的视图编写的,这让我更难理解,因为我从未使用过基于函数的视图。

我只需要知道装饰器背后的想法是什么以及它是如何工作的。

【问题讨论】:

    标签: ajax django


    【解决方案1】:

    经过谷歌搜索,我找到了this

    from django.http import HttpResponseBadRequest
    
    def ajax_required(f):
        """
        AJAX request required decorator
        use it in your views:
    
        @ajax_required
        def my_view(request):
            ....
    
        """    
        def wrap(request, *args, **kwargs):
                if not request.is_ajax():
                    return HttpResponseBadRequest()
                return f(request, *args, **kwargs)
        wrap.__doc__=f.__doc__
        wrap.__name__=f.__name__
        return wrap
    

    没有尝试过,所以你必须尝试一下。基本部分是request.is_ajax(),它检查请求是否是通过 AJAX 发出的。另请查看docs 以获取有关is_ajax() 方法的更多信息。

    编辑

    要在 django 中装饰视图类,请参阅文档中的 Decorating the class。基本上,装饰器函数包装了类的方法。所以你可以使用 django @method_decorator() 在你的装饰器函数中包装一个方法(ajax_required):

    @method_decorator(ajax_required)
    def method_you_want_to_get_only_AJAX_requests():
        ......
    

    【讨论】:

      【解决方案2】:
          from functools import wraps
          from django.core.exceptions import PermissionDenied
          def require_ajax(view):
              @wraps(view)
              def _wrapped_view(request, *args, **kwargs):
                  if request.is_ajax():
                      return view(request, *args, **kwargs)
                  else:
                      raise PermissionDenied()
              return _wrapped_view
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-07
        • 1970-01-01
        • 2017-12-09
        • 2017-03-15
        • 2020-12-29
        • 2017-01-04
        • 2013-02-06
        • 1970-01-01
        相关资源
        最近更新 更多