Django - 自定义装饰器只允许ajax请求

时间:2015-12-08 09:59:15

标签: ajax django

我的项目中几乎没有只有ajax调用的视图,我需要检查只有在请求是ajax时才处理视图。所以我想写一个装饰师。在搜索类似类型的装饰器时,我遇到了一些但却无法理解的东西。 我使用基于类的视图,并将在get / post方法上使用此装饰器。我确实找到了一些片段,但都是为基于功能的视图编写的,这使我更难理解,因为我从未使用基于函数的视图。

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

2 个答案:

答案 0 :(得分:4)

在谷歌搜索后,我找到了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():
    ......

答案 1 :(得分:4)

    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