#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
, что будет более подходящим.