Как можно request.method == Нет в Django - PullRequest
1 голос
/ 20 октября 2011

Я пытаюсь выяснить эту проблему, связанную с Джанго из https://github.com/miki725/Django-jQuery-File-Uploader-Integration-demo/issues/1

При каких условиях можно request.method == None в Джанго?

Ответы [ 2 ]

6 голосов
/ 20 октября 2011

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 не отправляется клиентом в запросе (не спрашивайте меня почему, я не знаком с этим).

0 голосов
/ 20 октября 2011

Мне удалось добиться этого через AJAX, в частности, вызвав функцию jQuery $ .ajax (см. http://api.jquery.com/jQuery.ajax/) с типом "POST", но без данных:

    $.ajax({
      type: "POST",
      url: "/something",
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...