【发布时间】:2016-03-13 04:44:04
【问题描述】:
我的项目中只有很少的视图仅由 ajax 调用,我需要检查仅当请求是 ajax 时才处理视图。所以我想写一个装饰器。在寻找类似类型的装饰器时,我遇到了几个但什么都不懂。 我使用基于类的视图,并将在 get/post 方法上使用这个装饰器。我确实发现了一些 sn-ps,但都是为基于函数的视图编写的,这让我更难理解,因为我从未使用过基于函数的视图。
我只需要知道装饰器背后的想法是什么以及它是如何工作的。
【问题讨论】:
我的项目中只有很少的视图仅由 ajax 调用,我需要检查仅当请求是 ajax 时才处理视图。所以我想写一个装饰器。在寻找类似类型的装饰器时,我遇到了几个但什么都不懂。 我使用基于类的视图,并将在 get/post 方法上使用这个装饰器。我确实发现了一些 sn-ps,但都是为基于函数的视图编写的,这让我更难理解,因为我从未使用过基于函数的视图。
我只需要知道装饰器背后的想法是什么以及它是如何工作的。
【问题讨论】:
经过谷歌搜索,我找到了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():
......
【讨论】:
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
【讨论】: