Объекты ответа и запроса

Быстрый обзор

Django использует объекты ответа и запроса, чтобы передавать состояние в системе.

Когда запрашивает страница, Django создает объект HttpRequest, который содержит различные данные о запросе. Потом Django определяет и загружает необходимое представление и вызывает его передавая объект HttpRequest первым аргументом. Каждое представление должно вернуть объект HttpResponse.

Этот раздел описывает API объектов HttpRequest и HttpResponse, которые определены в модуле django.http.

Объект HttpRequest

class HttpRequest

Атрибуты

Все атрибуты должны рассматриваться как неизменяемые, пока об обратном не будет сказано явно. Атрибут session является исключением из правила.

HttpRequest.body

Тело запроса HTTP в байтовой строке. Он полезен для обработки данных различными способами, а не только традиционной HTML формой: передача изображений, загрузка XML и др. Для обработки данных обычной формы, используйте HttpRequest.POST.

Вы также можете читать с объекта HttpRequest используя интерфейс чтения с файла. Смотрите HttpRequest.read().

HttpRequest.path

Содержит полный путь к запрашиваемой странице, не включая домен.

Например: "/music/bands/the_beatles/"

HttpRequest.path_info

Для некоторых конфигурация сервера, часть URL-а после названия домена содержит префикс скрипта и “полезную” часть пути(path info portion). Атрибут path_info всегда содержит часть URL-а, которую использует Django, не зависимо от сервера . Использование этого атрибута вместо path сделает ваш код более надежным и независимым от настроек сервера.

Например, если WSGIScriptAlias равен "/minfo", атрибут path может быть равен "/minfo/music/bands/the_beatles/" в то время как path_info будет равен "/music/bands/the_beatles/".

HttpRequest.method

Строка отображающая метод HTTP запроса. Значение всегда будет в верхнем регистре. Например:

if request.method == 'GET':
    do_something()
elif request.method == 'POST':
    do_something_else()
HttpRequest.encoding

Кодировка, которая используется для декодирования данных формы (или None, что означает использовать значение настройки DEFAULT_CHARSET). Вы можете изменить значение этого атрибута. При последующих доступах к атрибутам (например, чтение с GET или POST) будет использоваться новое значение encoding. Полезен, если вы знаете, что данные формы не используют кодировку указанную DEFAULT_CHARSET.

HttpRequest.GET

Объект с интерфейсом словаря, который содержит HTTP GET параметры. Смотрите описание QueryDict ниже.

HttpRequest.POST

Объект-словарь содержащий все POST параметры, переданные формой. Смотрите описание QueryDict ниже. Если вам необходимо получить необработанные данные или данные переданные не через форму, используйте атрибут HttpRequest.body.

Changed in Django 1.5:

Before Django 1.5, HttpRequest.POST contained non-form data.

Запрос может использовать метод POST но содержать пустой словарь POST – например, форма была передана через POST HTTP метод, но не содержала никаких данных. Поэтому, вы не должны использовать if request.POST для проверки был ли использован метод POST; вместо этого используйте if request.method == "POST" (смотрите ниже).

Заметим: POST не содержит информацию о загруженных файлах. Смотрите FILES.

HttpRequest.REQUEST

Объект с интерфейсом словаря, который ищет данные сначала в POST, затем в GET. Сделан по примеру $_REQUEST в PHP.

Например, если GET = {"name": "john"} и POST = {"age": '34'}, REQUEST["name"] будет содержать "john", а REQUEST["age"] - "34".

Рекомендуется использовать GET и POST вместо REQUEST, поскольку последние являются более явными.

HttpRequest.COOKIES

Словарь Python содержащий все “cookie”. Ключи и значения являются строками.

HttpRequest.FILES

Объект с интерфейсом словаря, который содержит все загруженные файлы. Каждый ключ в FILES это name из <input type="file" name="" />. Каждое значение в FILES это объект UploadedFile описанный ниже.

Подробности в разделе Управление файлами.

Заметим, что FILES содержит данные только, если метод запроса POST и <form> содержал enctype="multipart/form-data". В другом случае FILES будет содержать пустой словарь.

HttpRequest.META

Словарь Python содержащий все доступные HTTP заголовки запроса. Доступные заголовки зависят от сервера и клиента. Вот список возможных:

  • CONTENT_LENGTH – размер содержимого запроса (содержимое учитывается как строка).

  • CONTENT_TYPE – MIME-тип содержимого запроса.

  • HTTP_ACCEPT_ENCODING – принимаемые кодировки ответа.

  • HTTP_ACCEPT_LANGUAGE – принимаемые языки ответа.

  • HTTP_HOST – заголовок HTTP Host отсылаемый клиентом.

  • HTTP_REFERER – Ссылающаяся страница, если определена.

  • HTTP_USER_AGENT – Строка “user-agent” клиента.

  • QUERY_STRING – Строка запроса, не обработаная.

  • REMOTE_ADDR – IP-адрес клиента.

  • REMOTE_HOST – имя хоста клиента.

  • REMOTE_USER – пользователь аутентифицированный Web-сервером, если определен.

  • REQUEST_METHOD – Метод запроса. Строка, например, "GET" или "POST".

  • SERVER_NAME – имя хоста сервера.

  • SERVER_PORT – Порт сервера(строка).

За исключением CONTENT_LENGTH и CONTENT_TYPE из примера выше, любый HTTP заголовок запроса преобразуется в ключ атрибута META конвертированием всех символов в верхний регистр, заменой дефисов нижним подчеркиванием и добавлением префикса HTTP_ к названию. Например, заголовок X-Bender будет добавлен в META с ключом HTTP_X_BENDER.

HttpRequest.user

Содержит объект AUTH_USER_MODEL представляющий текущего “залогиненого” пользователя. Если пользователь не авторизирован, атрибут user будет содержать django.contrib.auth.models.AnonymousUser. Вы можете различить их используя is_authenticated():

if request.user.is_authenticated():
    # Do something for logged-in users.
else:
    # Do something for anonymous users.

Атрибут user доступен только если проект использует AuthenticationMiddleware. Подробности смотрите в разделе Аутентификация пользователей в Django.

HttpRequest.session

Объект с интерфейсом словаря, который доступен для чтения и изменений, представляет текущую сессию. Доступен только, если настроена поддержка сессии. Подробности смотрите в разделе про использование сессии.

HttpRequest.urlconf

Не определяется Django, но будет использован если другой код (например, собственный функциональный слой(middleware)) установит его. Если определен, значение будет использоваться как URLconf текущего запроса вместо значения настройки ROOT_URLCONF. Подробности смотрите в разделе Как Django обрабатывает запрос.

HttpRequest.resolver_match
New in Django 1.5.

Экземпляр ResolverMatch представляющий запрошенный URL. Атрибут устанавливается при поиске подходящего URL-шаблона, это значит что middleware он не доступен т.к. они вызывается до обработки URL-а (в таком случае вместо process_request можно использовать process_view).

Методы

HttpRequest.get_host()

Возвращает оригинальное имя хоста используя информацию из HTTP_X_FORWARDED_HOST (если включена настройка USE_X_FORWARDED_HOST) и HTTP_HOST заголовков, в соответствующем порядке. Если эти значения не определенны, метод использует комбинацию SERVER_NAME и SERVER_PORT как описано в PEP 3333.

Например: "127.0.0.1:8000"

Примечание

Метод get_host() вернет ошибку если сервер находится за несколькими proxy. Одно из решений – создать функциональный слой(middleware), который переопределить заголовки proxy таким образом:

class MultipleProxyMiddleware(object):
    FORWARDED_FOR_FIELDS = [
        'HTTP_X_FORWARDED_FOR',
        'HTTP_X_FORWARDED_HOST',
        'HTTP_X_FORWARDED_SERVER',
    ]

    def process_request(self, request):
        """
        Rewrites the proxy headers so that only the most
        recent proxy is used.
        """
        for field in self.FORWARDED_FOR_FIELDS:
            if field in request.META:
                if ',' in request.META[field]:
                    parts = request.META[field].split(',')
                    request.META[field] = parts[-1].strip()

Этот функциональный слой должен находиться перед любый другим, который может использовать get_host(), например, CommonMiddleware или CsrfViewMiddleware.

HttpRequest.get_full_path()

Возвращает path, со строкой запроса, если она присутствует.

Например: "/music/bands/the_beatles/?print=true"

HttpRequest.build_absolute_uri(location)

Возвращает абсолютный URI для аргумента location. Если location не указан, будет использовано значение request.get_full_path().

Если location уже является абсолютным URI, значение останется не измененным. В другом случае абсолютный URI будет создан с использованием данных запроса.

Например: "http://example.com/music/bands/the_beatles/?print=true"

Возвращает значение подписанных(signed) cookie, или вызывает исключение django.core.signing.BadSignature если подпись не верна. При передаче аргумента default исключение не будет вызвано и функция вернет значение по-умолчанию.

Необязательный аргумент salt может быть использован для дополнительной защиты от ” brute force” атак. Если передан аргумент max_age, время подписи cookie будет проверяться, чтобы убедиться, что cookie не старше max_age секунд.

Например:

>>> request.get_signed_cookie('name')
'Tony'
>>> request.get_signed_cookie('name', salt='name-salt')
'Tony' # assuming cookie was set using the same salt
>>> request.get_signed_cookie('non-existing-cookie')
...
KeyError: 'non-existing-cookie'
>>> request.get_signed_cookie('non-existing-cookie', False)
False
>>> request.get_signed_cookie('cookie-that-was-tampered-with')
...
BadSignature: ...
>>> request.get_signed_cookie('name', max_age=60)
...
SignatureExpired: Signature age 1677.3839159 > 60 seconds
>>> request.get_signed_cookie('name', False, max_age=60)
False

Подробности смотрите в разделе о криптографической подписи.

HttpRequest.is_secure()

Возвращает True если запрос безопасный; то есть, если он был выполнен через HTTPS.

HttpRequest.is_ajax()

Возвращает True, если запрос был выполнен через XMLHttpRequest, проверяя равен ли заголовок HTTP_X_REQUESTED_WITH значению 'XMLHttpRequest'. Большинство современных JavaScript библиотек используют этот заголовок. Если вы самостоятельно выполняете XMLHttpRequest запрос (в браузере), необходимо установить этот заголовок, иначе метод is_ajax() не будет работать.

HttpRequest.read(size=None)
HttpRequest.readline()
HttpRequest.readlines()
HttpRequest.xreadlines()
HttpRequest.__iter__()

Методы предоставляющие интерфейс файла для чтения данных из объекта HttpRequest. Это дает возможность читать содержимое запроса в потоке. Один из вариантов использования – это обработка большого XML-документа “парсером”, без создания всего XML-дерева в памяти.

Предоставляя стандартный интерфейс, объект HttpRequest можно передавать непосредственно в XML-“парсер” такой как ElementTree:

import xml.etree.ElementTree as ET
for element in ET.iterparse(request):
    process(element)

Объект UploadedFile

class UploadedFile

Атрибуты

UploadedFile.name

Название загруженного файла.

UploadedFile.size

Размер, в байтах, загруженного файла.

Методы

UploadedFile.chunks(chunk_size=None)

Возвращает генератор, который последовательно выдает блоками данные файла.

UploadedFile.read(num_bytes=None)

Читает определенное количество байтов из файла.

Объект QueryDict

class QueryDict

В объекте HttpRequest, атрибуты GET и POST являются экземплярами класса django.http.QueryDict. QueryDict – это класс с интерфейсом словаря, который дополнительной хранить несколько значений для одного ключа. Это необходимо так как определенные элементы HTML-форм(например, <select multiple="multiple">) передают несколько значений для одного ключа.

Экземпляр QueryDict неизменяемый, если только вы не создадите его копию используя copy(). Это означает, что вы не можете непосредственно изменить атрибуты request.POST и request.GET.

Методы

Класс QueryDict представляет все стандартные методы словаря, так как является его подклассом. Исключения описаны здесь:

QueryDict.__getitem__(key)

Возвращает значение для переданного ключа. Если ключа содержит несколько значений, __getitem__() возвращает последнее значение. Вызывает исключение django.utils.datastructures.MultiValueDictKeyError если ключ не существует. (Это подкласс стандартного исключения Python KeyError, так что вы как обычно можете обрабатывать исключение KeyError.)

QueryDict.__setitem__(key, value)

Устанавливает значения ключа в [value] (список Python с единственным элементом value). Заметим, что этот метод, так же как и другие методы словаря изменяющие значения, могут быть вызваны только для изменяемого объекта QueryDict (который был создан через copy()).

QueryDict.__contains__(key)

Возвращает True если переданный ключ существует. Это позволяет вам использовать if "foo" in request.GET.

QueryDict.get(key, default)

Аналогичен методу __getitem__(), но возвращает значение по-умолчанию вместо исключения, если ключ не существует.

QueryDict.setdefault(key, default)

Аналогичен методу setdefault() словаря, но использует метод __setitem__().

QueryDict.update(other_dict)

Принимает QueryDict или обычный словарь. Аналогичен методу update() словаря, но добавляет значения к текущему словарю, а не заменяет их. Например:

>>> q = QueryDict('a=1')
>>> q = q.copy() # to make it mutable
>>> q.update({'a': '2'})
>>> q.getlist('a')
[u'1', u'2']
>>> q['a'] # returns the last
[u'2']
QueryDict.items()

Аналогичен методу items() словаря, но получает значения аналогично методу __getitem__(). Например:

>>> q = QueryDict('a=1&a=2&a=3')
>>> q.items()
[(u'a', u'3')]
QueryDict.iteritems()

Аналогичен методу iteritems() словаря. Как и метод QueryDict.items(), получает значения способом описанным в QueryDict.__getitem__().

QueryDict.iterlists()

Аналогичен методу QueryDict.iteritems(), но возвращает все значения, списком, для ключа.

QueryDict.values()

Аналогичен методу values() словаря, но получает данные аналогично методу __getitem__(). Например:

>>> q = QueryDict('a=1&a=2&a=3')
>>> q.values()
[u'3']
QueryDict.itervalues()

Аналогичен методу QueryDict.values(), но является генератором.

В дополнение, QueryDict содержит такие методы:

QueryDict.copy()

Возвращает копию объекта, используя copy.deepcopy() из стандартных библиотек Python. Копия будет изменяемая – то есть, вы можете изменять ее значения.

QueryDict.getlist(key, default)

Возвращает данные для ключа в виде списка. Возвращает пустой список, если ключ не существует и не указанно значение по-умолчанию. Этот метод всегда возвращает список, если не указанно значение по-умолчанию.

QueryDict.setlist(key, list_)

Устанавливает значение ключа в список list_ (в отличии от __setitem__()).

QueryDict.appendlist(key, item)

Добавляет элемент во внутренний список значений ключа.

QueryDict.setlistdefault(key, default_list)

Аналогичен setdefault, но принимает список значений, а не одно значение.

QueryDict.lists()

Аналогичен методу items(), но включает все значения списком для каждого элемента словаря. Например:

>>> q = QueryDict('a=1&a=2&a=3')
>>> q.lists()
[(u'a', [u'1', u'2', u'3'])]
QueryDict.pop(key)

Возвращает список значений для переданного ключа и удаляет его из словаря. Вызывает KeyError, если ключ не существует. Например:

>>> q = QueryDict('a=1&a=2&a=3', mutable=True)
>>> q.pop('a')
[u'1', u'2', u'3']
QueryDict.popitem()

Удаляет произвольный элемент словаря(т.к. не сохраняется порядок ключей) и возвращает кортеж содержащий ключ и список значений. Вызывает KeyError, если словарь не содержит элементов. Например:

>>> q = QueryDict('a=1&a=2&a=3', mutable=True)
>>> q.popitem()
(u'a', [u'1', u'2', u'3'])
QueryDict.dict()

Возвращает dict-представление объекта QueryDict. Для каждой пары (ключ, список) в QueryDict, возвращаемый словарь будет содержать ключ и значение, значением будет последнее значение из списка аналогично методу QueryDict.__getitem__():

>>> q = QueryDict('a=1&a=3&a=5')
>>> q.dict()
{u'a': u'5'}
QueryDict.urlencode([safe])

Возвращает строку данных в формате запроса. Например:

>>> q = QueryDict('a=2&b=3&b=5')
>>> q.urlencode()
'a=2&b=3&b=5'

Используя аргумент safe, можно указать безопасные символы, которые не будут закодированы. Например:

>>> q = QueryDict('', mutable=True)
>>> q['next'] = '/a&b/'
>>> q.urlencode(safe='/')
'next=/a%26b/'

Объект HttpResponse

class HttpResponse

В отличии от объекта HttpRequest, который создается Django, объект HttpResponse создаете вы. Каждое представление должно создать и вернуть объект HttpResponse.

Класс HttpResponse находится в модуле django.http.

Использование

Передача строки

Типичное использование заключается в передаче содержимого страницы в виде строке в конструктор HttpResponse:

>>> from django.http import HttpResponse
>>> response = HttpResponse("Here's the text of the Web page.")
>>> response = HttpResponse("Text only, please.", content_type="text/plain")

Но если вам необходимо добавлять содержимое постепенно, вы можете использовать объект response как объект файла:

>>> response = HttpResponse()
>>> response.write("<p>Here's the text of the Web page.</p>")
>>> response.write("<p>Here's another paragraph.</p>")

Передача итератора

Вы можете передать итератор в конструктор HttpResponse вместо строки. Если вы используете такой подход, итератор должен возвращать строки.

При передаче итератора в HttpResponse создается потоковый(streaming) ответ, но только если middleware не обращался к HttpResponse.content до возвращения ответа.

Changed in Django 1.5:

This technique is fragile and was deprecated in Django 1.5. If you need the response to be streamed from the iterator to the client, you should use the StreamingHttpResponse class instead.

As of Django 1.7, when HttpResponse is instantiated with an iterator, it will consume it immediately, store the response content as a string, and discard the iterator.

Changed in Django 1.5:

You can now use HttpResponse as a file-like object even if it was instantiated with an iterator. Django will consume and save the content of the iterator on first access.

Установка заголовков

При установке или удалении заголовка в объекте ответа, рассматривайте его как словарь:

>>> response = HttpResponse()
>>> response['Age'] = 120
>>> del response['Age']

Заметим, что в отличии от словаря, del не вызовет исключение KeyError если заголовок не определен.

Для установки заголовков Cache-Control и Vary, лучше использовать функции patch_cache_control() и patch_vary_headers() из модуля django.utils.cache, так как эти поля могут содержать несколько значений, разделенных запятыми. Эти функции добавят новые значение не удаляя существующие.

HTTP заголовки не могут содержать перенос строки. При попытке добавить заголовок содержащий символ переноса строки (CR или LF) будет вызвано исключение BadHeaderError

Указываем браузеру воспринимать ответ как вложенный файл

Для этого используйте аргумент content_type и установите заголовок Content-Disposition. Например, вот так вы можете вернуть таблицу Microsoft Excel:

>>> response = HttpResponse(my_data, content_type='application/vnd.ms-excel')
>>> response['Content-Disposition'] = 'attachment; filename="foo.xls"'

Заголовок Content-Disposition никак не относится к Django, но очень легко забыть синтаксис, поэтому мы добавили пример.

Атрибуты

HttpResponse.content

Строковое представление содержимого, закодированное с объекта Unicode при необходимости.

HttpResponse.status_code

Код HTTP состояния ответа.

HttpResponse.reason_phrase
New in Django 1.6.

Описание HTTP ответа(HTTP reason phrase).

HttpResponse.streaming

Всегда False.

Указывает middleware, что этот ответ потоковый и его нужно обрабатывать не так, как обычные запросы.

Методы

HttpResponse.__init__(content='', content_type=None, status=200, reason=None)

Создает экземпляр HttpResponse с переданным содержимым и MIME-типом.

content должен быть строкой или итератором. Если это итератор, он должен возвращать строки, которые будут объединены для формирования содержимого ответа. Если это не итератор и не строка, значение будет конвертировано в строковое представление.

content_type - MIME-тип, возможно с кодировкой, используется в HTTP заголовке Content-Type. Если не указан, используются настройки DEFAULT_CONTENT_TYPE и DEFAULT_CHARSET, по умолчанию: “text/html; charset=utf-8”.

Раньше этот параметр назывался ``mimetype``(теперь этот атрибут считается устаревшим).

status – это Код HTTP состояния ответа.

New in Django 1.6.

reason – это описание HTTP ответа. Если не указано, будет использоваться стандартное значение.

HttpResponse.__setitem__(header, value)

Устанавливает заголовок ответа. header и value должны быть строками.

HttpResponse.__delitem__(header)

Удаляет заголовок ответа. Не вызывает исключения, если заголовок не существует. Регистронезависимый.

HttpResponse.__getitem__(header)

Возвращает значение заголовка. Регистрозависимый.

HttpResponse.has_header(header)

Возвращает True или False в результате регистронезависимого поиска заголовка по указанному названию.

Устанавливает cookie. Аргументы соответствуют аргументам для конструктора объекта Cookie.Morsel из стандартных библиотек Python.

  • max_age должен содержать количество секунд или None (по-умолчанию), если cookie должна существовать до закрытия браузера. Если expires не указан, он будет вычислен.

  • expires должен быть строкой в формате "Wdy, DD-Mon-YY HH:MM:SS GMT" или объект datetime.datetime в UTC. Если expires объект datetime, значение max_age будет вычислено.

  • Используйте domain если хотите установить междоменные cookie. Например, domain=".lawrence.com" установит cookie доступные для доменов www.lawrence.com, blogs.lawrence.com и calendars.lawrence.com. Иначе, cookie будут доступны только для текущего домена.

  • Используйте httponly=True, если хотите ограничит доступ клиентского JavaScript fк этим cookie.

    HTTPOnly – это флаг добавляемый в HTTP заголовок Set-Cookie ответа. Он не является частью стандарта RFC 2109, и поддерживается не всеми браузерами. Однако, если он поддерживается, это может быть полезным для уменьшения риска, что клиентский скрипт получит доступа к защищенным данным cookie.

Аналогичен set_cookie(), но использует криптографическую подписаь перед установкой cookie. Используется вместе с методом HttpRequest.get_signed_cookie(). Вы можете использовать не обязательный аргумент salt для дополнительной защиты, но не забывайте добавлять его при вызове HttpRequest.get_signed_cookie().

Удаляет cookie. Не вызывает исключения, если cookie не существует.

Учитывая механизм работы cookie, значения path и domain должны быть такими же, какие использовались при вызове set_cookie() – в противном случае cookie могут быть не удалены.

HttpResponse.write(content)

Метод для соблюдения интерфейса объекта файла.

HttpResponse.flush()

Метод для соблюдения интерфейса объекта файла.

HttpResponse.tell()

Метод для соблюдения интерфейса объекта файла.

Подклассы HttpResponse

Django содержит несколько подклассов HttpResponse, которые представляют различные типы HTTP ответов. Как и HttpResponse, эти подклассы находятся в модуле django.http.

class HttpResponseRedirect

Конструктор принимает один обязательный аргумент – путь для перенаправления. Это может быть полный URL (например, 'http://www.yahoo.com/search/') или абсолютный путь без домена (например, '/search/'). Дополнительные необязательные аргументы можно найти в описании HttpResponse. Возвращает код HTTP состояния равный 302.

url
New in Django 1.6.

Этот атрибут, доступный только для чтения, содержит URL для редиректа (аналог заголовка Location).

class HttpResponsePermanentRedirect

Аналогичен HttpResponseRedirect, но возвращает постоянное перенаправление (код HTTP состояния 301) вместо временного перенаправления (код состояния 302).

class HttpResponseNotModified

Конструктор не принимает аргументы и ответ должен быть пустым. Используйте, чтобы указать, что страница не изменилась с прошлого запроса пользователя (код состояния 304).

class HttpResponseBadRequest

Аналогичен HttpResponse но использует код состояния 400.

class HttpResponseNotFound

Аналогичен HttpResponse но использует код состояния 404.

class HttpResponseForbidden

Аналогичен HttpResponse но использует код состояния 403.

class HttpResponseNotAllowed

Аналогичен HttpResponse, но использует код состояния 405. Обязательный аргумент: список разрешенных методов (например, ['GET', 'POST']).

class HttpResponseGone

Аналогичен HttpResponse но использует код состояния 410.

class HttpResponseServerError

Аналогичен HttpResponse но использует код состояния 500.

Примечание

Если ваш подкласс HttpResponse содержит метод render, Django воспринимает его как аналог класса SimpleTemplateResponse. Метод render должен возвращать правильный объект ответа.

Объекты StreamingHttpResponse

New in Django 1.5.
class StreamingHttpResponse

Класс StreamingHttpResponse используется для “стриминга” ответа из Django в браузер. Это может пригодится для медленных запросов или требующих большого количества памяти. Например, можного генерировать большие CSV файлы.

Performance considerations

Архитектура Django создавалась для обработки быстрых запросов. Потоковые запросы держат рабочий процесс и подключение к БД до окончания обработки запроса. Это может негативно повлиять на производительность.

Сложные задачи следует выполнять вне цикла запрос-ответ и не злоупотреблять потоковыми ответами.

StreamingHttpResponse не является подклассом HttpResponse и предоставляет немного другое API. Однако, они очень похожи со следующими отличиями:

  • Принимает итератор строк.

  • Вы не можете обратиться к содержимому ответа кроме как проитерировав объект ответа. Это должно происходить после возвращения ответа клиенту.

  • Не содержит атрибут content. Вместо этого содержит атрибут streaming_content.

  • Вы не можете использовать методы объекта файла tell() или write(). Это вызовет исключение.

StreamingHttpResponse должен использовать только в тех ситуациях, когда мы не можем сформировать тело ответа до его возврата клиенту. Т.к. нет доступа к содержимому ответа, многие middleware не могут нормально работать. Например заголовки ETag и Content- Length не могут быть добавлены к потоковому ответу.

Атрибуты

StreamingHttpResponse.streaming_content

Итератор строк, которые являются содержимым ответа.

HttpResponse.status_code

Код HTTP состояния ответа.

HttpResponse.reason_phrase
New in Django 1.6.

Описание HTTP ответа(HTTP reason phrase).

HttpResponse.streaming

Всегда True.