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