Вы действительно должны проверять тип запроса в своих представлениях, а не в промежуточном программном обеспечении. Как я уже упоминал в комментариях выше, вы не можете определить, является ли запрос сообщением POST только из URL, не говоря уже о том, какие данные POST он несет.
Проверка типа запроса в представлении очень проста - просто проверьте, что request.method
равно "GET"
или "POST"
.
Если вы делаете это часто, кратчайшим путем будет создание декоратора, который сделает эту проверку за вас. Например, следующий декоратор проверяет, использовался ли запрос GET для вызова этого представления, или же возвращает объект HttpResponseBadRequest
(код состояния 400):
# untested code, use with care
def require_GET(view_func):
def wrap(request, *args, **kwargs):
if request.method != "GET":
return HttpResponseBadRequest("Expecting GET request")
return view_func(request, *args, **kwargs)
wrap.__doc__ = view_func.__doc__
wrap.__dict__ = view_func.__dict__
wrap.__name__ = view_func.__name__
return wrap
Затем вы можете просто добавить к своей функции просмотра @require_GET
, и проверка будет выполнена, когда вызывается представление. Э.Г.
@require_GET
def your_view(request):
# ...
Вы можете сделать то же самое для POST.
Вот пример декоратора, проверяющего запрос POST, который принимает необязательный список полей, которые должны быть предоставлены с запросом POST.
# again, untested so use with care.
def require_POST(view_func, required_fields=None):
def wrap(request, *args, **kwargs):
if request.method != "POST":
return HttpResponseBadRequest("Expecting POST request")
if required_fields:
for f in required_fields:
if f not in request.POST:
return HttpResponseBadRequest("Expecting field %s" % f)
return view_func(request, *args, **kwargs)
wrap.__doc__ = view_func.__doc__
wrap.__dict__ = view_func.__dict__
wrap.__name__ = view_func.__name__
return wrap
Используйте вот так:
@require_POST
def another_view(request):
# ...
или
@require_POST(required_fields=("username", "password"))
def custom_login_view(request):
# ...
Обновление
ОК, мой плохой. Я только что заново изобрел колесо.
Django уже предоставляет декораторы @require_GET
и @require_POST
. См. django.views.decorators.http .