Django использует объекты ответа и запроса, чтобы передавать состояние в системе.
Когда запрашивает страница, Django создает объект HttpRequest, который содержит различные данные о запросе. Потом Django определяет и загружает необходимое представление и вызывает его передавая объект HttpRequest первым аргументом. Каждое представление должно вернуть объект HttpResponse.
Этот раздел описывает API объектов HttpRequest и HttpResponse, которые определены в модуле django.http.
Все атрибуты должны рассматриваться как неизменяемые, пока об обратном не будет сказано явно.
Строка, указывающая схему запроса (обычно http или https).
Тело запроса HTTP в байтовой строке. Он полезен для обработки данных различными способами, а не только традиционной HTML формой: передача изображений, загрузка XML и др. Для обработки данных обычной формы, используйте HttpRequest.POST.
Вы также можете читать с объекта HttpRequest используя интерфейс чтения с файла. Смотрите HttpRequest.read().
Содержит полный путь к запрашиваемой странице, не включая домен.
Например: "/music/bands/the_beatles/"
Для некоторых конфигурация сервера, часть URL-а после названия домена содержит префикс скрипта и “полезную” часть пути(path info portion). Атрибут path_info всегда содержит часть URL-а, которую использует Django, не зависимо от сервера . Использование этого атрибута вместо path сделает ваш код более надежным и независимым от настроек сервера.
Например, если WSGIScriptAlias равен "/minfo", атрибут path может быть равен "/minfo/music/bands/the_beatles/" в то время как path_info будет равен "/music/bands/the_beatles/".
Строка отображающая метод HTTP запроса. Значение всегда будет в верхнем регистре. Например:
if request.method == 'GET':
do_something()
elif request.method == 'POST':
do_something_else()
Кодировка, которая используется для декодирования данных формы (или None, что означает использовать значение настройки DEFAULT_CHARSET). Вы можете изменить значение этого атрибута. При последующих доступах к атрибутам (например, чтение с GET или POST) будет использоваться новое значение encoding. Полезен, если вы знаете, что данные формы не используют кодировку указанную DEFAULT_CHARSET.
Объект с интерфейсом словаря, который содержит HTTP GET параметры. Смотрите описание QueryDict ниже.
Объект-словарь содержащий все POST параметры, переданные формой. Смотрите описание QueryDict ниже. Если вам необходимо получить необработанные данные или данные переданные не через форму, используйте атрибут HttpRequest.body.
Запрос может использовать метод POST но содержать пустой словарь POST – например, форма была передана через POST HTTP метод, но не содержала никаких данных. Поэтому, вы не должны использовать if request.POST для проверки был ли использован метод POST; вместо этого используйте if request.method == "POST" (смотрите ниже).
Заметим: POST не содержит информацию о загруженных файлах. Смотрите FILES.
Словарь Python содержащий все “cookie”. Ключи и значения являются строками.
Объект с интерфейсом словаря, который содержит все загруженные файлы. Каждый ключ в FILES это name из <input type="file" name="" />. Каждое значение в FILES это объект UploadedFile.
Подробности в разделе Управление файлами.
Заметим, что FILES содержит данные только, если метод запроса POST и <form> содержал enctype="multipart/form-data". В другом случае FILES будет содержать пустой словарь.
Словарь Python содержащий все доступные HTTP заголовки запроса. Доступные заголовки зависят от сервера и клиента. Вот список возможных:
CONTENT_LENGTH – размер содержимого запроса (содержимое учитывается как строка).
CONTENT_TYPE – MIME-тип содержимого запроса.
HTTP_ACCEPT – принимаемые типы ответа ответа.
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.
Обратите внимание, runserver обрезает все заголовки с подчеркиванием в названии, по этому вы их не увидите в META. Это предотвращает подделку заголовков, которая возможна из-за преобразования дефисов в подчеркивания в названиях переменных окружения WSGI. Такое поведение совпадает с поведением Web-серверов, таких как Nginx и Apache 2.4+.
Экземпляр ResolverMatch представляющий запрошенный URL. Атрибут устанавливается при поиске подходящего URL-шаблона, это значит что middleware он не доступен т.к. они вызывается до обработки URL-а (в таком случае вместо process_request можно использовать process_view).
Django не устанавливает эти атрибуты, но использует их, если ваше приложение установит их.
Шаблонный тег url будет использовать значение этого атрибута как аргумент current_app для reverse().
Будет использоваться как URLconf текущего запроса вместо значения настройки ROOT_URLCONF. Подробности смотрите в разделе Как Django обрабатывает запрос.
urlconf можно установить в None, чтобы отменить какие-либо изменения, сделанные предыдущими промежуточными слоями, и снова использовать ROOT_URLCONF.
В предыдущих версиях установка urlconf=None вызывала ImproperlyConfigured.
Некоторые промежуточные слои, включая встроенные в Django, добавляют атрибуты к объекту запроса. Если вы не нашли атрибут в объекте запроса, убедитесь, что нужный промежуточный слой добавлен в MIDDLEWARE_CLASSES.
Добавляется SessionMiddleware: объект с интерфейсом словаря, который содержит текущую сессию.
Добавляется CurrentSiteMiddleware: экземпляр Site или RequestSite, который возвращается get_current_site(), отображает текущий сайт.
Добавляется AuthenticationMiddleware: содержит объект 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.
Возвращает оригинальное имя хоста используя информацию из 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.
Возвращает оригинальный порт запроса, используя данные из HTTP_X_FORWARDED_PORT (если включена настройка USE_X_FORWARDED_PORT) и значение SERVER_PORT из META в указанном порядке.
Возвращает path, со строкой запроса, если она присутствует.
Например: "/music/bands/the_beatles/?print=true"
Возвращает абсолютный URI для аргумента location. Если location не указан, будет использовано значение request.get_full_path().
Если location уже является абсолютным URI, значение останется не измененным. В другом случае абсолютный URI будет создан с использованием данных запроса.
Например: "https://example.com/music/bands/the_beatles/?print=true"
Примечание
Не следует использовать HTTP и HTTPS на одному сайте. build_absolute_uri() всегда сгенерирует полный URI с протоколом из запроса. Если вы хотите перенаправить пользователей на HTTPS, лучше позволить веб-серверу перенаправлять весь HTTP трафик на HTTPS.
Возвращает значение подписанных(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
Подробности смотрите в разделе о криптографической подписи.
Возвращает True если запрос безопасный; то есть, если он был выполнен через HTTPS.
Возвращает True, если запрос был выполнен через XMLHttpRequest, проверяя равен ли заголовок HTTP_X_REQUESTED_WITH значению 'XMLHttpRequest'. Большинство современных JavaScript библиотек используют этот заголовок. Если вы самостоятельно выполняете XMLHttpRequest запрос (в браузере), необходимо установить этот заголовок, иначе метод is_ajax() не будет работать.
Если ответ зависит от того, отправлен он через AJAX или нет, и вы используете кеширование Django, например кеширующий мидлвар, необходимо использовать декоратор vary_on_headers('HTTP_X_REQUESTED_WITH') для корректного кеширования.
Методы, предоставляющие интерфейс файла для чтения данных из объекта HttpRequest. Это дает возможность читать содержимое запроса в потоке. Один из вариантов использования – это обработка большого XML-документа “парсером”, без создания всего XML-дерева в памяти.
Предоставляя стандартный интерфейс, объект HttpRequest можно передавать непосредственно в XML-парсер такой как ElementTree:
import xml.etree.ElementTree as ET
for element in ET.iterparse(request):
process(element)
В объекте HttpRequest, атрибуты GET и POST являются экземплярами класса django.http.QueryDict – это класс с интерфейсом словаря, который дополнительной хранить несколько значений для одного ключа. Это необходимо так как определенные элементы HTML-форм(например, <select multiple>) передают несколько значений для одного ключа.
QueryDict из request.POST и request.GET – неизменяемы. Чтобы получить изменяемую версию, используйте .copy().
Класс QueryDict представляет все стандартные методы словаря, так как является его подклассом. Исключения описаны здесь:
Создает экземпляр QueryDict из query_string.
>>> QueryDict('a=1&a=2&c=3')
<QueryDict: {'a': ['1', '2'], 'c': ['3']}>
Если параметр query_string не указан, полученный QueryDict будет пустым (без ключей и значений).
Большинство объектов QueryDict, которые используются в Django, в том числе request.POST и request.GET, будут неизменяемыми. Если вы создаете экземпляр самостоятельно, можете сделать его изменяемым, передав mutable=True в __init__().
Строки ключей и значений будут преобразованы в unicode с использованием encoding. Если encoding не указан, будет использоваться значение DEFAULT_CHARSET.
В предыдущих версиях query_string был обязательным параметром.
Возвращает значение для переданного ключа. Если ключа содержит несколько значений, __getitem__() возвращает последнее значение. Вызывает исключение django.utils.datastructures.MultiValueDictKeyError если ключ не существует. (Это подкласс стандартного исключения Python KeyError, так что вы как обычно можете обрабатывать исключение KeyError.)
Устанавливает значения ключа в [value] (список Python с единственным элементом value). Заметим, что это, так же как и другие методы словаря изменяющие значения, могут быть вызваны только для изменяемого объекта QueryDict (который был создан через copy()).
Возвращает True если переданный ключ существует. Это позволяет вам использовать if "foo" in request.GET.
Аналогичен методу __getitem__(), но возвращает значение по-умолчанию вместо исключения, если ключ не существует.
Аналогичен методу setdefault() словаря, но использует метод __setitem__().
Принимает QueryDict или обычный словарь. Аналогичен методу update() словаря, но добавляет значения к текущему словарю, а не заменяет их. Например:
>>> q = QueryDict('a=1', mutable=True)
>>> q.update({'a': '2'})
>>> q.getlist('a')
['1', '2']
>>> q['a'] # returns the last
['2']
Аналогичен методу items() словаря, но получает значения аналогично методу __getitem__(). Например:
>>> q = QueryDict('a=1&a=2&a=3')
>>> q.items()
[('a', '3')]
Аналогичен методу iteritems() словаря. Как и метод QueryDict.items(), получает значения способом описанным в QueryDict.__getitem__().
Аналогичен методу QueryDict.iteritems(), но возвращает все значения, списком, для ключа.
Аналогичен методу values() словаря, но получает данные аналогично методу __getitem__(). Например:
>>> q = QueryDict('a=1&a=2&a=3')
>>> q.values()
['3']
Аналогичен методу QueryDict.values(), но является генератором.
В дополнение, QueryDict содержит такие методы:
Возвращает копию объекта, используя copy.deepcopy() из стандартных библиотек Python. Копия будет изменяемая, даже если оригинал не был.
Возвращает данные для ключа в виде списка. Возвращает пустой список, если ключ не существует и не указанно значение по-умолчанию. Этот метод всегда возвращает список, если не указанно значение по-умолчанию другого типа.
Устанавливает значение ключа в список list_ (в отличии от __setitem__()).
Добавляет элемент во внутренний список значений ключа.
Аналогичен setdefault, но принимает список значений, а не одно значение.
Аналогичен методу items(), но включает все значения списком для каждого элемента словаря. Например:
>>> q = QueryDict('a=1&a=2&a=3')
>>> q.lists()
[('a', ['1', '2', '3'])]
Возвращает список значений для переданного ключа и удаляет его из словаря. Вызывает KeyError, если ключ не существует. Например:
>>> q = QueryDict('a=1&a=2&a=3', mutable=True)
>>> q.pop('a')
['1', '2', '3']
Удаляет произвольный элемент словаря(т.к. не сохраняется порядок ключей) и возвращает кортеж содержащий ключ и список значений. Вызывает KeyError, если словарь не содержит элементов. Например:
>>> q = QueryDict('a=1&a=2&a=3', mutable=True)
>>> q.popitem()
('a', ['1', '2', '3'])
Возвращает dict-представление объекта QueryDict. Для каждой пары (ключ, список) в QueryDict, возвращаемый словарь будет содержать ключ и значение, значением будет последнее значение из списка аналогично методу QueryDict.__getitem__():
>>> q = QueryDict('a=1&a=3&a=5')
>>> q.dict()
{'a': '5'}
Возвращает строку данных в формате запроса. Например:
>>> 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/'
В отличии от объекта 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 сразу выполнит итератор и сохранит результат как строку.
Если необходимо отдавать данные из итератора в потоке, используйте экземпляр StreamingHttpResponse.
При установке или удалении заголовка в объекте ответа, рассматривайте его как словарь:
>>> 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, но очень легко забыть синтаксис, поэтому мы добавили пример.
Байтовое представление содержимого, закодированное с объекта Unicode при необходимости.
Кодировка, в которую будет закодирован ответ. Если не указана во время создания объекта HttpResponse, будет проверятся content_type, и если не будет найдена, будет использоваться значение настройки DEFAULT_CHARSET.
Код HTTP состояния ответа.
Если reason_phrase не установлен явно, изменение status_code вне конструктора также изменит reason_phrase.
Описание HTTP ответа(HTTP reason phrase).
reason_phrase теперь по умолчанию не в верхнем регистре. Теперь используются значения из стандарта HTTP.
Если не указан явно, reason_phrase определяется из текущего значения status_code.
Всегда False.
Указывает middleware, что этот ответ потоковый и его нужно обрабатывать не так, как обычные запросы.
True, если ответ был закрыт.
Создает экземпляр HttpResponse с переданным содержимым и MIME-типом.
content должен быть строкой или итератором. Если это итератор, он должен возвращать строки, которые будут объединены для формирования содержимого ответа. Если это не итератор и не строка, значение будет конвертировано в строковое представление.
content_type - MIME-тип, возможно с кодировкой, используется в HTTP заголовке Content-Type. Если не указан, используются настройки DEFAULT_CONTENT_TYPE и DEFAULT_CHARSET, по умолчанию: “text/html; charset=utf-8”.
status – это Код HTTP состояния ответа.
reason – это описание HTTP ответа. Если не указано, будет использоваться стандартное значение.
charset - кодировка, в которую будет закодирован ответ. Если не указана во время создания объекта HttpResponse, будет проверятся content_type, и если не будет найдена, будет использоваться значение настройки DEFAULT_CHARSET.
Был добавлен параметр charset.
Устанавливает заголовок ответа. header и value должны быть строками.
Удаляет заголовок ответа. Не вызывает исключения, если заголовок не существует. Регистронезависимый.
Возвращает значение заголовка. Регистрозависимый.
Возвращает True или False в результате регистронезависимого поиска заголовка по указанному названию.
Устанавливает заголовок, если он еще не был установлен.
Устанавливает 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 к этим cookie.
HTTPOnly – это флаг добавляемый в HTTP заголовок Set-Cookie ответа. Он не является частью стандарта RFC 2109, и поддерживается не всеми браузерами. Однако, если он поддерживается, это может быть полезным для уменьшения риска, что клиентский скрипт получит доступа к защищенным данным cookie.
Предупреждение
Спецификации RFC 2109 и RFC 6265 указывают, что клиент должен поддерживать куки минимального размера 4096 байт. Для большинства браузеров это максимальный размер кук. Django не вызовет исключение, если вы попытаетесь добавить куки больше 4096 байт, но многие браузеры установят их неправильно.
Аналогичен set_cookie(), но использует криптографическую подписаь перед установкой cookie. Используется вместе с методом HttpRequest.get_signed_cookie(). Вы можете использовать не обязательный аргумент salt для дополнительной защиты, но не забывайте добавлять его при вызове HttpRequest.get_signed_cookie().
Удаляет cookie. Не вызывает исключения, если cookie не существует.
Учитывая механизм работы cookie, значения path и domain должны быть такими же, какие использовались при вызове set_cookie() – в противном случае cookie могут быть не удалены.
Метод для соблюдения интерфейса объекта файла.
Метод для соблюдения интерфейса объекта файла.
Метод для соблюдения интерфейса объекта файла.
Возвращает значение HttpResponse.content. Этот метод позволяет использовать HttpResponse как объект-файл.
Всегда True. Этот метод позволяет использовать HttpResponse как объект-файл.
Записывает список строк в ответ. Разделители строк не добавляются. Этот метод позволяет использовать HttpResponse как объект-файл.
Django содержит несколько подклассов HttpResponse, которые представляют различные типы HTTP ответов. Как и HttpResponse, эти подклассы находятся в модуле django.http.
Конструктор принимает один обязательный аргумент – путь для перенаправления. Это может быть полный URL (например, 'https://www.yahoo.com/search/') или абсолютный путь без домена (например, '/search/'). Дополнительные необязательные аргументы можно найти в описании HttpResponse. Возвращает код HTTP состояния равный 302.
Этот атрибут, доступный только для чтения, содержит URL для редиректа (аналог заголовка Location).
Аналогичен HttpResponseRedirect, но возвращает постоянное перенаправление (код HTTP состояния 301) вместо временного перенаправления (код состояния 302).
Конструктор не принимает аргументы и ответ должен быть пустым. Используйте, чтобы указать, что страница не изменилась с прошлого запроса пользователя (код состояния 304).
Аналогичен HttpResponse но использует код состояния 400.
Аналогичен HttpResponse но использует код состояния 404.
Аналогичен HttpResponse но использует код состояния 403.
Аналогичен HttpResponse, но использует код состояния 405. Обязательный аргумент: список разрешенных методов (например, ['GET', 'POST']).
Аналогичен HttpResponse но использует код состояния 410.
Аналогичен HttpResponse но использует код состояния 500.
Примечание
Если ваш подкласс HttpResponse содержит метод render, Django воспринимает его как аналог класса SimpleTemplateResponse. Метод render должен возвращать правильный объект ответа.
Дочерний класс HttpResponse, который помогает вернуть ответ в JSON. Наследует большую часть поведения родительского класса с некоторыми исключениями:
Заголовок Content-Type по умолчанию равен application/json.
Первый параметр data должен быть словарем. Если параметр safe равен False (смотрите ниже), может принимать любой объект, который можно преобразовать в JSON.
encoder, по умолчанию равен django.core.serializers.json.DjangoJSONEncoder, будет использовать для преобразования данных. Подрбности смотрите в JSON сериализации.
Параметр safe по умолчанию равен True. Если равен False, можно передать любой объект для преобразования в JSON (иначе – только dict). Если safe равен True и передали не dict объект, будет вызвано исключение TypeError.
Аргумент json_dumps_params содержит словарь именованных переменных, который передаются в json.dumps() при генерации ответа.
Был добавлен аргумент json_dumps_params.
Пример использования:
>>> from django.http import JsonResponse
>>> response = JsonResponse({'foo': 'bar'})
>>> response.content
b'{"foo": "bar"}'
Для этого передайте в safe значение False:
>>> response = JsonResponse([1, 2, 3], safe=False)
При safe=False будет вызвано исключение TypeError.
Предупреждение
До 5-й редакции EcmaScript была возможность использовать уязвимость в конструкторе Array в JavaScript. Поэтому Django по умолчанию не позволяет передавать не словари в JsonResponse. Однако, большинство современных браузеров поддерживают EcmaScript 5, исключая эту атаку. Поэтому можно отключить эту предосторожность безопасности.
Чтобы использовать другой преобразователь в JSON, передайте его через аргумент encoder конструктора:
>>> response = JsonResponse(data, encoder=MyJSONEncoder)
Класс StreamingHttpResponse используется для “стриминга” ответа из Django в браузер. Это может пригодится для медленных запросов или требующих большого количества памяти. Например, можно генерировать большие CSV файлы.
Проблемы производительности
Архитектура Django создавалась для обработки быстрых запросов. Потоковые запросы держат рабочий процесс и подключение к БД до окончания обработки запроса. Это может негативно повлиять на производительность.
Сложные задачи следует выполнять вне цикла запрос-ответ и не злоупотреблять потоковыми ответами.
StreamingHttpResponse не является подклассом HttpResponse и предоставляет немного другое API. Однако, они очень похожи со следующими отличиями:
Принимает итератор строк.
Вы не можете обратиться к содержимому ответа кроме как проитерировав объект ответа. Это должно происходить после возвращения ответа клиенту.
Не содержит атрибут content. Вместо этого содержит атрибут streaming_content.
Вы не можете использовать методы объекта файла tell() или write(). Это вызовет исключение.
StreamingHttpResponse должен использовать только в тех ситуациях, когда мы не можем сформировать тело ответа до его возврата клиенту. Т.к. нет доступа к содержимому ответа, многие middleware не могут нормально работать. Например заголовки ETag и Content- Length не могут быть добавлены к потоковому ответу.
Итератор строк, которые являются содержимым ответа.
Код HTTP состояния ответа.
Если reason_phrase не установлен явно, изменение status_code вне конструктора также изменит reason_phrase.
Описание HTTP ответа(HTTP reason phrase).
reason_phrase теперь по умолчанию не в верхнем регистре. Теперь используются значения из стандарта HTTP.
Если не указан явно, reason_phrase определяется из текущего значения status_code.
Всегда True.
FileResponse – дочерний класс StreamingHttpResponse оптимизированный для работы с бинарными файлами. Использует wsgi.file_wrapper, если он предоставлен wsgi сервером, иначе стримит файл небольшими частями.
FileResponse ожидает файл открытый в бинарном режиме чтения:
>>> from django.http import FileResponse
>>> response = FileResponse(open('myfile.png', 'rb'))
Mar 31, 2016