【发布时间】:2017-03-08 18:32:41
【问题描述】:
我想限制对特定视图的访问,以便只接受 AJAX 请求,因此我实现了以下装饰器:
def require_ajax(func):
def decorator(func):
def inner(request, *args, **kwargs):
if not request.is_ajax():
return HttpResponseBadRequest()
return func(request, *args, **kwargs)
return inner
return decorator
这在函数视图中非常有效,但我不知道如何在基于类的视图中使用它。我已经尝试过this,但出现了错误,我认为是由于我使用的是旧版本的 Django。
好吧,我的基于类的视图:
class AjaxView(TemplateView):
template_name = '...'
def get_context_data(self, **kwargs):
...
return context
@method_decorator(require_ajax)
def dispatch(self, *args, **kwargs):
return super(AjaxView, self).dispatch(*args, **kwargs)
【问题讨论】:
-
究竟是什么错误?在不知道问题的情况下无法很好地帮助您。使用
method_decorator是一种不错的方法,但是您可能需要查看 Django 1.4 中该方法的文档。 django.readthedocs.io/en/1.4/topics/… -
你需要为 CBV 做一个 mixin - 同样的方式
login_required和LoginRequiredMixin工作 -
@makaveli 错误只是关于 kwargs,它说有意外的 kwargs(我在
get_context_data中使用)。 -
@Sayse 你能详细说明一下吗?
-
Source for LRM - 本质上,您可以将您的装饰器应用于每个需要它的视图的
dispatch方法,或者制作一个类似于此的mixin,然后它只是class AjaxView(MyMixin, TemplateView)
标签: python django python-2.7 python-decorators django-1.4