Объекты запроса и ответа
Краткий обзор
Django использует объекты запроса и ответа для передачи состояния через систему.
Когда страница запрашивается, Django создает объект HttpRequest, содержащий метаданные о запросе. Затем Django загружает соответствующий вид, передавая объект HttpRequest в качестве первого аргумента функции представления. Каждое представление отвечает за возврат объекта HttpResponse.
Этот документ объясняет API для объектов HttpRequest и HttpResponse, которые определены в модуле django.http.
HttpRequest объекты
-
class HttpRequest
Атрибуты
Все атрибуты следует считать только для чтения, если не указано иное.
-
HttpRequest.scheme -
Строка, представляющая схему запроса (
httpилиhttpsобычно).
-
HttpRequest.body -
Необработанное тело HTTP-запроса в виде байтовой строки. Это полезно для обработки данных нестандартными способами, отличными от обычных HTML-форм: бинарные изображения, XML-payload и т. д. Для обработки обычных данных форм используйте
HttpRequest.POST.Вы также можете читать из
HttpRequestс помощью интерфейса типа файла с помощьюHttpRequest.read()илиHttpRequest.readline(). Доступ к атрибутуbodyпосле чтения запроса с помощью любого из этих методов потока ввода/вывода приведет кRawPostDataException.
-
HttpRequest.path -
Строка, представляющая полный путь к запрашиваемой странице, без схемы или домена.
Пример:
"/music/bands/the_beatles/"
-
HttpRequest.path_info -
При некоторых конфигурациях веб-сервера часть URL после имени хоста разделяется на часть префикса скрипта и часть path info. Атрибут
path_infoвсегда содержит часть path info пути, независимо от используемого веб-сервера. Использование этого вместо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.content_type -
Строка, представляющая MIME-тип запроса, полученная из заголовка
CONTENT_TYPE.
-
HttpRequest.content_params -
Словарь параметров ключ/значение, включенных в заголовок
CONTENT_TYPE.
-
HttpRequest.GET -
Объект, подобный словарю, содержащий все параметры HTTP GET. См. документацию
QueryDictниже.
-
HttpRequest.POST -
Объект, подобный словарю, содержащий все параметры HTTP POST, при условии, что запрос содержит данные формы. См. документацию
QueryDictниже. Если вам нужно получить доступ к сырым или неформатированным данным, отправленным в запросе, обратитесь к атрибутуHttpRequest.bodyвместо этого.Возможен случай, когда запрос приходит по POST с пустым
POSTсловарем – если, скажем, форма запрошена через HTTP-метод POST, но не содержит данных формы. Поэтому не следует использоватьif request.POSTдля проверки использования метода POST; вместо этого используйтеif request.method == "POST"(см.HttpRequest.method).POSTне включает информацию о загрузке файлов. См.FILES.
-
HttpRequest.COOKIES -
Словарь, содержащий все cookie. Ключи и значения являются строками.
-
HttpRequest.FILES -
Объект, подобный словарю, содержащий все загруженные файлы. Каждый ключ в
FILES– этоnameиз<input type="file" name="">. Каждое значение вFILES– этоUploadedFile.См. Управление файлами для получения дополнительной информации.
FILESбудет содержать данные только в том случае, если метод запроса был POST, и<form>, отправленный в запрос, содержалenctype="multipart/form-data". В противном случаеFILESбудет пустым объектом, подобным словарю.
-
HttpRequest.META -
Словарь, содержащий все доступные 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– Пользователь, авторизованный веб-сервером, если он есть. -
REQUEST_METHOD– Строка, такая как"GET"или"POST". -
SERVER_NAME– Имя хоста сервера. -
SERVER_PORT– Порт сервера (как строка).
За исключением
CONTENT_LENGTHиCONTENT_TYPE, как указано выше, все HTTP-заголовки в запросе преобразуются в ключиMETAпутем преобразования всех символов в верхний регистр, замены дефисов на подчеркивания и добавления префиксаHTTP_к имени. Таким образом, заголовок с именемX-Benderбудет сопоставлен с ключомMETAHTTP_X_BENDER.Обратите внимание, что
runserverудаляет все заголовки с подчеркиваниями в имени, поэтому вы их не увидите вMETA. Это предотвращает подделку заголовков, основанную на неоднозначности между подчеркиваниями и дефисами, которые оба нормализуются до подчеркиваний в переменных среды WSGI. Это поведение соответствует поведению веб-серверов, таких как Nginx и Apache 2.4+.HttpRequest.headersявляется более простым способом доступа ко всем заголовкам, начинающимся с HTTP (плюсCONTENT_LENGTHиCONTENT_TYPE). -
-
HttpRequest.headers -
New in Django 2.2.
Объект типа словаря, нечувствительный к регистру, предоставляющий доступ ко всем заголовкам HTTP (плюс
Content-LengthиContent-Typeв запросе).Имя каждого заголовка стилизуется с использованием заглавных букв (например,
User-Agent) при отображении. Вы можете получить доступ к заголовкам, не обращая внимания на регистр:>>> request.headers {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6', ...} >>> 'User-Agent' in request.headers True >>> 'user-agent' in request.headers True >>> request.headers['User-Agent'] Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) >>> request.headers['user-agent'] Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) >>> request.headers.get('User-Agent') Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) >>> request.headers.get('user-agent') Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)Для использования, например, в шаблонах Django, заголовки также можно искать, используя подчеркивания вместо дефисов:
{{ request.headers.user_agent }}Изменено в Django 3.0:Добавлена поддержка поиска с использованием подчеркиваний.
-
HttpRequest.resolver_match -
Экземпляр
ResolverMatch, представляющий разрешенный URL. Этот атрибут устанавливается только после разрешения URL, что означает, что он доступен во всех представлениях, но не в middleware, которые выполняются до разрешения URL (хотя вы можете использовать его вprocess_view()).
Атрибуты, устанавливаемые кодом приложения
Django не устанавливает эти атрибуты самостоятельно, но использует их, если они установлены вашим приложением.
-
HttpRequest.current_app -
Тег шаблона
urlбудет использовать его значение в качестве аргументаcurrent_appкreverse().
-
HttpRequest.urlconf -
Это будет использоваться как корневой URLconf для текущего запроса, перезаписывая настройку
ROOT_URLCONF. Подробности см. в Как Django обрабатывает запрос.urlconfможет быть установлено вNoneдля отмены любых изменений, внесенных предыдущим middleware, и возвращения к использованиюROOT_URLCONF.
Атрибуты, устанавливаемые middleware
Некоторые из middleware, включённые в приложения Django's contrib, устанавливают атрибуты на запрос. Если вы не видите атрибут в запросе, убедитесь, что соответствующий класс middleware указан в MIDDLEWARE.
-
HttpRequest.session -
Из
SessionMiddleware: Читаемый и записываемый, подобный словарю объект, представляющий текущую сессию.
-
HttpRequest.site -
Из
CurrentSiteMiddleware: ЭкземплярSiteилиRequestSite, как возвращаетсяget_current_site(), представляющий текущий сайт.
-
HttpRequest.user -
Из
AuthenticationMiddleware: ЭкземплярAUTH_USER_MODEL, представляющий текущего пользователя, авторизованного в системе. Если пользователь не авторизован,userбудет установлено в экземплярAnonymousUser. Их можно отличить с помощьюis_authenticated, как показано ниже:if request.user.is_authenticated: ... # Do something for logged-in users. else: ... # Do something for anonymous users.
Методы
-
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()терпит неудачу, когда хост находится за несколькими прокси-серверами. Одним из решений является использование middleware для переписывания заголовков прокси, как в следующем примере:class MultipleProxyMiddleware: FORWARDED_FOR_FIELDS = [ 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED_HOST', 'HTTP_X_FORWARDED_SERVER', ] def __init__(self, get_response): self.get_response = get_response def __call__(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() return self.get_response(request)Этот middleware должен быть размещен перед любым другим middleware, который полагается на значение
get_host()– например,CommonMiddlewareилиCsrfViewMiddleware.
-
HttpRequest.get_port() -
Возвращает исходный порт запроса, используя информацию из
HTTP_X_FORWARDED_PORT(еслиUSE_X_FORWARDED_PORTвключено) иSERVER_PORTMETAпеременных, в указанном порядке.
-
HttpRequest.get_full_path() -
Возвращает
path, плюс присоединённую строку запроса, если применимо.Пример:
"/music/bands/the_beatles/?print=true"
-
HttpRequest.get_full_path_info() -
Как
get_full_path(), но используетpath_infoвместоpath.Пример:
"/minfo/music/bands/the_beatles/?print=true"
-
HttpRequest.build_absolute_uri(location=None) -
Возвращает абсолютную URI-форму
location. Если местоположение не указано, местоположение будет установлено вrequest.get_full_path().Если местоположение уже является абсолютной URI, оно не будет изменено. В противном случае абсолютная URI строится с использованием доступных в этом запросе переменных сервера. Например:
>>> request.build_absolute_uri() 'https://example.com/music/bands/the_beatles/?print=true' >>> request.build_absolute_uri('/bands/') 'https://example.com/bands/' >>> request.build_absolute_uri('https://example2.com/bands/') 'https://example2.com/bands/'Примечание
Смешение HTTP и HTTPS в одном сайте не рекомендуется, поэтому
build_absolute_uri()всегда будет генерировать абсолютную URI со схемой, имеющейся в текущем запросе. Если вам нужно перенаправить пользователей на HTTPS, лучше всего позволить вашему веб-серверу перенаправлять весь трафик HTTP на HTTPS.
-
Возвращает значение cookie для подписанной cookie или вызывает исключение
django.core.signing.BadSignature, если подпись больше не действительна. Если вы укажите аргументdefault, исключение будет подавлено, и вместо этого будет возвращено это значение по умолчанию.Необязательный аргумент
saltможет быть использован для дополнительной защиты от атак методом грубой силы на ваш секретный ключ. Если он предоставлен, аргумент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('nonexistent-cookie') ... KeyError: 'nonexistent-cookie' >>> request.get_signed_cookie('nonexistent-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()работал.Если ответ меняется в зависимости от того, запрошен ли он через AJAX, и вы используете какой-либо вид кеширования, например, кеширование Django's
cache middleware, вы должны декорировать представление с помощьюvary_on_headers('X-Requested-With'), чтобы ответы должным образом кешировались.
-
HttpRequest.read(size=None)
-
HttpRequest.readline()
-
HttpRequest.readlines()
-
HttpRequest.__iter__() -
Методы, реализующие интерфейс файла для чтения из экземпляра
HttpRequest. Это позволяет потреблять входящий запрос в потоковом режиме. Типичный случай использования — обработка большого XML-payload с итерационным парсером без построения всего XML-дерева в памяти.С учётом этого стандартного интерфейса экземпляр
HttpRequestможет быть передан напрямую XML-парсеру, например,ElementTree:import xml.etree.ElementTree as ET for element in ET.iterparse(request): process(element)
QueryDict объекты
-
class QueryDict
В объекте HttpRequest атрибуты GET и POST являются экземплярами django.http.QueryDict, класса, подобного словарю, настроенного для обработки нескольких значений для одного ключа. Это необходимо, потому что некоторые элементы HTML-форм, в частности <select multiple>, передают несколько значений для одного ключа.
Экземпляры QueryDict в request.POST и request.GET будут неизменяемыми при обращении в обычном цикле запроса/ответа. Чтобы получить изменяемую версию, необходимо использовать QueryDict.copy().
Методы
QueryDict реализует все стандартные методы словаря, поскольку он является подклассом словаря. Исключение составляет следующее:
-
QueryDict.__init__(query_string=None, mutable=False, encoding=None) -
Инициализирует объект
QueryDictна основеquery_string.>>> QueryDict('a=1&a=2&c=3') <QueryDict: {'a': ['1', '2'], 'c': ['3']}>Если
query_stringне передан, полученныйQueryDictбудет пустым (он не будет иметь ключей или значений).Большинство
QueryDictвстречимых вами, и, в частности, те, что вrequest.POSTиrequest.GET, будут неизменяемыми. Если вы инициализируете их самостоятельно, вы можете сделать их изменяемыми, передавmutable=Trueв его__init__().Строки для установки ключей и значений будут преобразованы из
encodingвstrЕслиencodingне задано, по умолчанию используетсяDEFAULT_CHARSET.
-
classmethod QueryDict.fromkeys(iterable, value='', mutable=False, encoding=None) -
Создаёт новый
QueryDictс ключами изiterableи каждым значением, равнымvalueНапример:>>> QueryDict.fromkeys(['a', 'a', 'b'], value='val') <QueryDict: {'a': ['val', 'val'], 'b': ['val']}>
-
QueryDict.__getitem__(key) -
Возвращает значение для заданного ключа. Если у ключа более одного значения, возвращается последнее значение. Вызывает
django.utils.datastructures.MultiValueDictKeyErrorесли ключ не существует. (Это подкласс стандартного PythonKeyError, поэтому вы можете продолжать ловитьKeyError.)
-
QueryDict.__setitem__(key, value) -
Устанавливает заданный ключ в
[value](список, единственный элемент которого —value). Обратите внимание, что это, как и другие функции словаря, имеющие побочные эффекты, может быть вызвано только на изменяемомQueryDict(таком, который был создан с помощьюQueryDict.copy()).
-
QueryDict.__contains__(key) -
Возвращает
Trueесли заданный ключ установлен. Это позволяет, например, делатьif "foo" in request.GET.
-
QueryDict.get(key, default=None) -
Использует ту же логику, что и
__getitem__(), с возможностью возвращать значение по умолчанию, если ключ не существует.
-
QueryDict.setdefault(key, default=None) -
Аналогично
dict.setdefault(), но использует__setitem__()внутри.
-
QueryDict.update(other_dict) -
Принимает либо
QueryDict, либо словарь. Как иdict.update(), но добавляет к текущим элементам словаря вместо их замены. Например:>>> q = QueryDict('a=1', mutable=True) >>> q.update({'a': '2'}) >>> q.getlist('a') ['1', '2'] >>> q['a'] # returns the last '2'
-
QueryDict.items() -
Аналогично
dict.items(), но использует ту же логику, что и__getitem__(), и возвращает объект-итератор вместо объекта-представления. Например:>>> q = QueryDict('a=1&a=2&a=3') >>> list(q.items()) [('a', '3')]
-
QueryDict.values() -
Аналогично
dict.values(), но использует ту же логику, что и__getitem__(), и возвращает итератор вместо объекта-представления. Например:>>> q = QueryDict('a=1&a=2&a=3') >>> list(q.values()) ['3']
Кроме того, QueryDict имеет следующие методы:
-
QueryDict.copy() -
Возвращает копию объекта, используя
copy.deepcopy(). Эта копия будет изменяемой, даже если исходная не была.
-
QueryDict.getlist(key, default=None) -
Возвращает список данных с запрошенным ключом. Возвращает пустой список, если ключ не существует, и значение по умолчанию не было предоставлено. Гарантируется, что будет возвращён список, если значение по умолчанию не является списком.
-
QueryDict.setlist(key, list_) -
Устанавливает заданный ключ в
list_(в отличие от__setitem__()).
-
QueryDict.appendlist(key, item) -
Добавляет элемент в внутренний список, связанный с ключом.
-
QueryDict.setlistdefault(key, default_list=None) -
Аналогично
setdefault(), но принимает список значений вместо одного значения.
-
QueryDict.lists() -
Аналогично
items(), но включает все значения в виде списка для каждого элемента словаря. Например:>>> q = QueryDict('a=1&a=2&a=3') >>> q.lists() [('a', ['1', '2', '3'])]
-
QueryDict.pop(key) -
Возвращает список значений для данного ключа и удаляет их из словаря. Вызывает
KeyErrorесли ключ не существует. Например:>>> q = QueryDict('a=1&a=2&a=3', mutable=True) >>> q.pop('a') ['1', '2', '3']
-
QueryDict.popitem() -
Удаляет произвольный элемент из словаря (поскольку нет понятия порядка) и возвращает кортеж из двух значений, содержащий ключ и список всех значений для ключа. Вызывает
KeyErrorпри вызове на пустом словаре. Например:>>> q = QueryDict('a=1&a=2&a=3', mutable=True) >>> q.popitem() ('a', ['1', '2', '3'])
-
QueryDict.dict() -
Возвращает представление
dictобъектаQueryDict. Для каждой пары (ключ, список) вQueryDict,dictбудет содержать (ключ, элемент), где элемент — один элемент из списка, используя ту же логику, что иQueryDict.__getitem__():>>> q = QueryDict('a=1&a=3&a=5') >>> q.dict() {'a': '5'}
-
QueryDict.urlencode(safe=None) -
Возвращает строку данных в формате строки запроса. Например:
>>> 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.
Использование
Передача строк
Типичное использование заключается в передаче содержимого страницы в виде строки, байтовой строки или memoryview конструктору 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 = HttpResponse(b'Bytestrings are also accepted.')
>>> response = HttpResponse(memoryview(b'Memoryview as well.'))
Была добавлена поддержка memoryview.
Но если вы хотите добавлять содержимое по частям, вы можете использовать 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 сразу же обработает итератор, сохранит его содержимое в виде строки и удалит его. Объекты с методом close(), такие как файлы и генераторы, будут немедленно закрыты.
Если вам нужно, чтобы ответ передавался клиенту по частям из итератора, вы должны использовать класс StreamingHttpResponse вместо него.
Установка полей заголовков
Для установки или удаления поля заголовка в ответе, используйте его как словарь:
>>> response = HttpResponse() >>> response['Age'] = 120 >>> del response['Age']
Обратите внимание, что в отличие от словаря, del не вызывает KeyError при отсутствии поля заголовка.
Для установки полей заголовков Cache-Control и Vary рекомендуется использовать методы patch_cache_control() и patch_vary_headers() из django.utils.cache, поскольку эти поля могут иметь несколько значений, разделенных запятыми. Методы «patch» гарантируют, что другие значения, например, добавленные посредством middleware, не будут удалены.
Поля заголовков 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 -
Строка байтов, представляющая содержимое, закодированная из строки, если необходимо.
-
HttpResponse.charset -
Строка, обозначающая кодировку символов, в которой будет закодирован ответ. Если она не задана во время создания
HttpResponse, она будет извлечена изcontent_typeи, если это не удастся, будет использовано значение настройкиDEFAULT_CHARSET.
-
HttpResponse.status_code -
Код состояния HTTP для ответа.
Если
reason_phraseне указан явно, изменение значенияstatus_codeвне конструктора также изменит значениеreason_phrase.
-
HttpResponse.reason_phrase -
Фраза причины ответа HTTP. Она использует стандартные фразы причин HTTP.
Если не указан явно,
reason_phraseопределяется по значениюstatus_code.
-
HttpResponse.streaming -
Это всегда
False.Этот атрибут нужен, чтобы middleware мог различать ответы, передаваемые по частям, и обычные ответы.
-
HttpResponse.closed -
Trueесли ответ был закрыт.
Методы
-
HttpResponse.__init__(content=b'', content_type=None, status=200, reason=None, charset=None) -
Инициализирует объект
HttpResponseс заданным содержимым страницы и типом содержимого.contentчаще всего является итератором, байтовой строкой,memoryviewили строкой. Другие типы будут преобразованы в байтовую строку путем кодирования их строкового представления. Итераторы должны возвращать строки или байтовые строки, которые будут объединены для формирования содержимого ответа.content_type— это тип MIME, который дополнительно может содержать кодировку символов и используется для заполнения заголовка HTTPContent-Type. Если он не указан, он формируется из'text/html'и настроекDEFAULT_CHARSET, по умолчанию:"text/html; charset=utf-8".status— это код состояния HTTP для ответа. Для наглядности можно использовать алиасы из Python’shttp.HTTPStatus, такие какHTTPStatus.NO_CONTENT.reason— это фраза ответа HTTP. Если она не указана, используется фраза по умолчанию.charset— это кодировка символов, в которой будет закодирован ответ. Если она не задана, она будет извлечена изcontent_type, и если это не удастся, будет использовано значение настройкиDEFAULT_CHARSET.Изменено в Django 3.0:Была добавлена поддержка
memoryviewcontent.
-
HttpResponse.__setitem__(header, value) -
Устанавливает заданное имя заголовка в заданное значение. Оба
headerиvalueдолжны быть строками.
-
HttpResponse.__delitem__(header) -
Удаляет заголовок с указанным именем. Не вызывает ошибок, если заголовок не существует. Нечувствительно к регистру.
-
HttpResponse.__getitem__(header) -
Возвращает значение для заданного имени заголовка. Нечувствительно к регистру.
-
HttpResponse.has_header(header) -
Возвращает
TrueилиFalseв зависимости от проверки имени заголовка без учета регистра.
-
HttpResponse.setdefault(header, value) -
Устанавливает заголовок, если он еще не установлен.
-
Устанавливает 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="example.com"установит cookie, который доступен для доменов www.example.com, blog.example.com и т. д. В противном случае cookie будет доступен только для домена, который его установил. - Используйте
secure=True, если вы хотите, чтобы cookie передавался только на сервер при запросе с использованием схемыhttps. -
Используйте
httponly=True, чтобы предотвратить доступ к cookie со стороны JavaScript на стороне клиента.HttpOnly — это флаг, включенный в заголовок ответа HTTP Set-Cookie. Он является частью стандарта RFC 6265 для cookies и может быть полезным способом снижения риска доступа защищенных данных cookie со стороны скрипта на стороне клиента.
- Используйте
samesite='Strict'илиsamesite='Lax'для предотвращения отправки cookie браузером при выполнении запроса с другого домена. SameSite не поддерживается всеми браузерами, поэтому это не замена защиты от CSRF Django, а мера защиты на несколько уровней.
Предупреждение
RFC 6265 гласит, что пользовательские агенты должны поддерживать cookies размером не менее 4096 байтов. Для многих браузеров это также максимальный размер. Django не вызовет исключение, если будет попытка сохранить cookie размером более 4096 байтов, но многие браузеры не установят cookie правильно.
-
-
Аналогично
set_cookie(), но с криптографическим подписанием куки перед установкой. Используйте в сочетании сHttpRequest.get_signed_cookie(). Дополнительную силу ключа можно получить, используя необязательный аргументsalt, но вам необходимо передать его соответствующему вызовуHttpRequest.get_signed_cookie().
-
Удаляет куки с заданным ключом. Если ключ не существует, то выполняется без ошибок.
Из-за особенностей работы куки, значения
pathиdomainдолжны быть идентичны тем, которые использовались вset_cookie(), иначе куки может не удалиться.Изменено в Django 2.2.15:Добавлен аргумент
samesite.
-
HttpResponse.close() -
Этот метод вызывается в конце запроса непосредственно сервером WSGI.
-
HttpResponse.write(content) -
Этот метод делает экземпляр
HttpResponseобъектом типа «файл».
-
HttpResponse.flush() -
Этот метод делает экземпляр
HttpResponseобъектом типа «файл».
-
HttpResponse.tell() -
Этот метод делает экземпляр
HttpResponseобъектом типа «файл».
-
HttpResponse.getvalue() -
Возвращает значение
HttpResponse.content. Этот метод делает экземплярHttpResponseобъектом типа «поток».
-
HttpResponse.readable() -
Всегда
False. Этот метод делает экземплярHttpResponseобъектом типа «поток».
-
HttpResponse.seekable() -
Всегда
False. Этот метод делает экземплярHttpResponseобъектом типа «поток».
-
HttpResponse.writable() -
Всегда
True. Этот метод делает экземплярHttpResponseобъектом типа «поток».
-
HttpResponse.writelines(lines) -
Записывает список строк в ответ. Разделители строк не добавляются. Этот метод делает экземпляр
HttpResponseобъектом типа «поток».
HttpResponse подклассы
Django включает несколько HttpResponse подклассов, обрабатывающих различные типы HTTP-ответов. Как и HttpResponse, эти подклассы находятся в django.http.
-
class HttpResponseRedirect -
Первый аргумент конструктора обязателен – путь для перенаправления. Это может быть полная URL-адреса (например,
'https://www.yahoo.com/search/'), абсолютный путь без домена (например,'/search/'), или даже относительный путь (например,'search/'). В последнем случае браузер клиента сам восстановит полную URL-адресу в соответствии с текущим путем. СмотритеHttpResponseдля других необязательных аргументов конструктора. Обратите внимание, что возвращается код HTTP 302.-
url -
Это только для чтения атрибут, представляющий 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 сам должен возвращать допустимый объект ответа.
Пользовательские классы ответов
Если вам нужен класс ответа, которого нет в Django, вы можете создать его с помощью http.HTTPStatus. Например:
from http import HTTPStatus
from django.http import HttpResponse
class HttpResponseNoContent(HttpResponse):
status_code = HTTPStatus.NO_CONTENT
JsonResponse объекты
-
class JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs) -
Подкласс
HttpResponse, который помогает создавать JSON-кодированный ответ. Он наследует большинство свойств от своего суперкласса с некоторыми отличиями:Его значение по умолчанию для заголовка
Content-Typeустановлено наapplication/json.Первый параметр,
data, должен быть экземпляромdict. Если параметрsafeустановлен вFalse(см. ниже), он может быть любым сериализуемым в JSON объектом.encoder, по умолчаниюdjango.core.serializers.json.DjangoJSONEncoder, будет использоваться для сериализации данных. См. Сериализация JSON для получения более подробной информации об этом сериализаторе.Булевый параметр
safeпо умолчаниюTrue. Если он установлен вFalse, для сериализации можно передать любой объект (в противном случае допускаются только экземплярыdict). Еслиsafeустановлен вTrue, и в качестве первого аргумента передан не объектdict, будет выброшено исключениеTypeError.Параметр
json_dumps_params— это словарь ключевых аргументов, которые нужно передать в вызовjson.dumps()для генерации ответа.
Использование
Типичное использование может выглядеть так:
>>> from django.http import JsonResponse
>>> response = JsonResponse({'foo': 'bar'})
>>> response.content
b'{"foo": "bar"}'
Сериализация объектов, отличных от словарей
Для сериализации объектов, отличных от dict, необходимо установить параметр safe в False.
>>> response = JsonResponse([1, 2, 3], safe=False)
Без передачи safe=False, будет выброшено исключение TypeError.
Предупреждение
До пятой версии ECMAScript (5th edition of ECMAScript) существовала возможность заражения конструктора JavaScript. По этой причине Django по умолчанию не допускает передачи объектов, отличных от словарей, в конструктор JsonResponse. Однако большинство современных браузеров реализуют EcmaScript 5, что устраняет этот вектор атаки. Поэтому данную предосторожность можно отключить.
Изменение стандартного кодировщика JSON
Если вам необходимо использовать другой класс кодировщика JSON, вы можете передать параметр encoder в метод конструктора:
>>> response = JsonResponse(data, encoder=MyJSONEncoder)
StreamingHttpResponse объекты
-
class StreamingHttpResponse
Класс StreamingHttpResponse используется для потоковой передачи ответа от Django в браузер. Это может потребоваться, если генерация ответа занимает слишком много времени или использует слишком много памяти. Например, это полезно для генерации больших CSV-файлов.
Соображения по производительности
Django разработан для кратковременных запросов. Потоковые ответы будут удерживать рабочий процесс в течение всего времени ответа. Это может привести к плохой производительности.
В целом, следует выполнять ресурсоемкие задачи за пределами цикла запроса-ответа, а не прибегать к потоковому ответу.
Класс StreamingHttpResponse не является подклассом HttpResponse, так как он имеет немного другой API. Однако он почти идентичен, с следующими заметными отличиями:
- Ему должен быть передан итератор, который возвращает байтовые строки в качестве содержимого.
- Вы не можете получить доступ к его содержимому, кроме как итерируя сам объект ответа. Это должно происходить только тогда, когда ответ возвращается клиенту.
- У него нет атрибута
content. Вместо этого у него есть атрибутstreaming_content. - Вы не можете использовать объект типа файла
tell()или методыwrite(). Это вызовет исключение.
StreamingHttpResponse следует использовать только в тех случаях, когда совершенно необходимо, чтобы все содержимое не было обработано до передачи данных клиенту. Поскольку к содержимому нельзя получить доступ, многие модули не могут нормально функционировать. Например, заголовки ETag и Content-Length не могут быть сгенерированы для потоковых ответов.
Атрибуты
-
StreamingHttpResponse.streaming_content -
Итератор содержимого ответа, закодированный в байтах в соответствии с
HttpResponse.charset.
-
StreamingHttpResponse.status_code -
Код состояния HTTP для ответа.
Если
reason_phraseне задан явно, изменение значенияstatus_codeвне конструктора также изменит значениеreason_phrase.
-
StreamingHttpResponse.reason_phrase -
Фраза причины HTTP для ответа. Она использует стандартные фразы причины HTTP.
Если не задано явно,
reason_phraseопределяется значениемstatus_code.
-
StreamingHttpResponse.streaming -
Это всегда
True.
FileResponse объекты
-
class FileResponse(open_file, as_attachment=False, filename='', **kwargs) -
FileResponse— подклассStreamingHttpResponse, оптимизированный для бинарных файлов. Он использует wsgi.file_wrapper, если это предоставляется сервером WSGI, в противном случае он передает файл по частям.Если
as_attachment=True, заголовокContent-Dispositionустанавливается вattachment, что предлагает браузеру предложить пользователю файл для скачивания. В противном случае заголовокContent-Dispositionсо значениемinline(стандартное значение браузера) будет задан только при наличии имени файла.Если у
open_fileнет имени или имяopen_fileне подходит, укажите пользовательское имя файла с помощью параметраfilename. Обратите внимание, что если вы передаёте объект типа файла, например,io.BytesIO, вам необходимоseek()его перед передачей вFileResponse.Заголовки
Content-LengthиContent-Typeавтоматически устанавливаются, когда их можно определить из содержимогоopen_file.
FileResponse принимает любой объект типа файла с бинарным содержимым, например, файл, открытый в бинарном режиме, как показано ниже:
>>> from django.http import FileResponse
>>> response = FileResponse(open('myfile.png', 'rb'))
Файл будет закрыт автоматически, поэтому не открывайте его с помощью контекстного менеджера.
Методы
-
FileResponse.set_headers(open_file) -
Этот метод автоматически вызывается во время инициализации ответа и устанавливает различные заголовки (
Content-Length,Content-Type, иContent-Disposition) в зависимости отopen_file.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/3.0/ref/request-response/