Как я могу сделать так, чтобы общий вид принимал только POST или GET

#django #django-views

#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 .

Ответ №1:

Это уже сделано для вас, поскольку вы предоставили только post метод

Из документов

Поскольку распознаватель URL-адресов Django ожидает отправки запроса и связанных с ним аргументов вызываемой функции, а не классу, представления на основе классов имеют метод класса as_view(), который возвращает функцию, которая может быть вызвана при поступлении запроса на URL-адрес, соответствующий связанному шаблону. Функция создает экземпляр класса и вызывает его метод dispatch() . отправка просматривает запрос, чтобы определить, является ли он GET, POST и т. Д., И Передает запрос соответствующему методу, если он определен, Или вызывает HttpResponseNotAllowed, если нет

Комментарии:

1. Но когда я получаю доступ к этому view через URL-адрес, который является GET запросом, он показывает просто пустую пустую страницу, а не Page Not Found что-то.

2. @user3595632 — Тогда это другая проблема, либо вы сами обрабатываете ответы, либо работает какой-то другой код

3. Должен ли я писать код, подобный этому: def get(self, request, * args, ** kwargs): поднять Http404 ???

4. @user3595632 — «Это уже сделано для вас» ….. «или вызывает HttpResponseNotAllowed, если нет»

5. @user3595632, пустая страница означает, что это пустой httpresponse с 405 status_code. Он уже работает. Вы можете проверить консоль

Ответ №2:

Вы должны implement get method in view обработать запрос get. В противном случае это вызовет a 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 , что будет более подходящим.