如何使通用视图仅接受POST或GET

时间:2016-10-14 10:56:21

标签: django django-views

class CustomerInfoCheckView(LoginRequiredMixin, 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
                    }
                )

正如您在此处所见,它只接受POST请求。

我想阻止用户使用view请求访问此GET

我找到了@require_http_methods,但它只支持function-based-view

2 个答案:

答案 0 :(得分:2)

您必须implement get method in view才能处理获取请求。否则它将引发405 by default,这意味着方法未实现。从django.views.generic.view继承的基于类的视图必须覆盖应该实现的所有方法。在您的情况下,代码可能如下所示。

class CustomerInfoCheckView(LoginRequiredMixin, 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
                }
            )
def get(self, request, *args, **kwargs):
     raise Http404

你可以筹集404,405或提供更合适的error response with 405 as status code

答案 1 :(得分:1)

它已经为您完成,因为您只提供了post方法

来自docs

  

因为Django的URL解析器希望将请求和关联的参数发送到可调用的函数而不是类,所以基于类的视图有一个as_view()类方法,该方法返回一个函数,当请求到达URL时可以调用该函数匹配相关的模式。该函数创建类的实例并调用其dispatch()方法。 dispatch查看请求以确定它是否为GET,POST等,并且将请求中继到匹配方法(如果已定义),或者如果不是则引发HttpResponseNotAllowed