我的項目中有幾個視圖只能通過ajax調用,而我需要將檢查視爲僅在請求是ajax時才處理。所以我想寫一個裝飾器。在尋找類似類型的裝飾者時,我遇到了一些但無法理解的東西。 我利用基於類的視圖,並將使用這個裝飾器上的get/post方法。我確實發現了一些片段,但都是針對基於功能的視圖編寫的,這使得我更難理解,因爲我從來沒有研究過基於視圖的功能。Django - 自定義裝飾器,只允許ajax請求
我只需要知道裝飾器背後的想法以及它是如何工作的。
我的項目中有幾個視圖只能通過ajax調用,而我需要將檢查視爲僅在請求是ajax時才處理。所以我想寫一個裝飾器。在尋找類似類型的裝飾者時,我遇到了一些但無法理解的東西。 我利用基於類的視圖,並將使用這個裝飾器上的get/post方法。我確實發現了一些片段,但都是針對基於功能的視圖編寫的,這使得我更難理解,因爲我從來沒有研究過基於視圖的功能。Django - 自定義裝飾器,只允許ajax請求
我只需要知道裝飾器背後的想法以及它是如何工作的。
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
谷歌搜索後,我發現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()
方法的信息。
EDIT
要裝飾的視圖類在Django的文檔中看到Decorating the class。基本上,裝飾器函數包裝類的一個方法。所以,你可以使用Django的@method_decorator()
在你的裝飾功能包的方法(ajax_required
):
@method_decorator(ajax_required)
def method_you_want_to_get_only_AJAX_requests():
......