TL; DR: request.method
никогда не бывает None
в реальном использовании, но для вашего конкретного случая вы смотрите не на ту вещь.
Общий HttpRequest
django/http/__init__.py
:
class HttpRequest(object):
...
def __init__(self):
...
self.method = None
...
Когда создается экземпляр HttpRequest
, его метод - None
. Но тогда WSGIRequest
и ModPythonRequest
не звоните HttpRequest.__init__
никогда.
Запросы через mod_wsgi
django/core/handlers/wsgi.py
:
class WSGIRequest(http.HttpRequest):
...
def __init__(self, environ):
...
self.method = environ['REQUEST_METHOD'].upper()
...
Таким образом, для mod_wsgi request.method
будет , никогда будет None
. Если каким-то искаженным образом вам удалось получить environ['REQUEST_METHOD']
, который не был определен или был None
, запрос завершился бы неудачей.
Запросы через mod_python
django/core/handlers/modpython.py
:
class ModPythonRequest(http.HttpRequest):
...
def _get_method(self):
return self.META['REQUEST_METHOD'].upper()
...
method = property(_get_method)
Применяются те же замечания, что и с WSGIRequest
. Не может быть None
.
Тестовый клиент
django.test.client.RequestFactory.request
создает экземпляр WSGIRequest
и вызывается каждый раз с REQUEST_METHOD
, определенным в environ
как строка в верхнем регистре, как и должно быть.
Резюме:
assert request.method is not None
Вы ищете ошибку не в том месте. В этом случае request.method == 'POST'
. Это сбой, когда request.META.get('CONTENT_TYPE', '') is None
. Причина этого заключается в том, что заголовок Content-Type
не отправляется клиентом в запросе (не спрашивайте меня почему, я не знаком с этим).