Django:我怎样才能让视图只接受ajax请求?

时间:2016-10-11 02:25:42

标签: ajax django

我想要做的是不允许一般的POST请求,只接受ajax请求。

class CustomerInfoCheckView(View):

    def post(self, request, *args, **kwargs):
        # CustomerInfoForm by ajax request
        if request.is_ajax():
            form = CustomerInfoForm(
                request.POST,
            )

            if form.is_valid():
                return JsonResponse(
                    data={
                        "valid": True,
                    }
                )
            else:
                return JsonResponse(
                    data={
                        "valid": False,
                        "errors": form.errors
                    }
                )
        else:
            return Http404

但问题是显示错误: AttributeError: type object 'Http404' has no attribute 'get'

我该如何处理?

1 个答案:

答案 0 :(得分:3)

Http404是一个例外,不是HttpResponse对象,所以你应该引发而不是 return

raise Http404

或者,您可以返回django.http.HttpResponseNotFound,其效果与引发上述异常大致相同:

return HttpResponseNotFound("Page not found")

顺便说一下,我会创建一个custom decorator来检查请求是否是AJAX,而不是用if/else子句污染视图代码。

您可以使用method_decorator函数使自定义装饰器与基于类的视图一起使用:

from django.utils.decorators import method_decorator

class CustomerInfoCheckView(View):
    @method_decorator(ajax_required)
    def post(self, request, *args, **kwargs):
        ...