Объекты запроса и ответа
Краткое описание
Django использует объекты запроса и ответа для передачи состояния через систему.
Когда страница запрашивается, Django создаёт объект HttpRequest, содержащий метаданные о запросе. Затем Django загружает соответствующий вид, передавая объект HttpRequest в качестве первого аргумента функции представления. Каждое представление отвечает за возврат объекта HttpResponse.
Этот документ описывает API для объектов HttpRequest и HttpResponse, которые определены в модуле django.http.
HttpRequest объекты
-
class HttpRequest[source]
Атрибуты
Все атрибуты следует рассматривать как только для чтения, если не указано иное.
-
HttpRequest.scheme -
Строка, представляющая схему запроса (
httpилиhttpsобычно).
-
HttpRequest.body -
Необработанное тело HTTP-запроса в виде байтовой строки. Это полезно для обработки данных другими способами, чем обычные HTML-формы: бинарные изображения, XML-загрузка и т. д. Для обработки обычных данных формы используйте
HttpRequest.POST.Вы также можете читать из
HttpRequestс помощью интерфейса типа файла. См.HttpRequest.read().
-
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— если, скажем, форма запрашивается по методу POST HTTP, но не включает данные формы. Поэтому не следует использоватьif request.POSTдля проверки использования метода POST; вместо этого используйтеif request.method == "POST"(см.HttpRequest.method).POSTне включает информацию о загрузке файлов. СмотритеFILES.
-
HttpRequest.COOKIES -
Словарь, содержащий все куки. Ключи и значения — строки.
-
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— строка пользователя-агента клиента. -
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 -
Введено в 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)
-
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, включенные в contrib приложения Django, устанавливают атрибуты в запросе. Если вы не видите атрибут в запросе, убедитесь, что соответствующий класс 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()[source] -
Возвращает исходный хост запроса, используя информацию из
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()[source] -
Возвращает исходный порт запроса, используя информацию из
HTTP_X_FORWARDED_PORT(еслиUSE_X_FORWARDED_PORTвключён) иSERVER_PORTMETAпеременных, в этом порядке.
-
HttpRequest.get_full_path()[source] -
Возвращает
path, плюс добавленный параметр запроса, если применимо.Пример:
"/music/bands/the_beatles/?print=true"
-
HttpRequest.get_full_path_info()[source] -
Новое в Django 2.1.
Как
get_full_path(), но используетpath_infoвместоpath.Пример:
"/minfo/music/bands/the_beatles/?print=true"
-
HttpRequest.build_absolute_uri(location=None)[source] -
Возвращает абсолютную форму 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()[source] -
Возвращает
True, если запрос является безопасным; то есть, если он был выполнен с помощью HTTPS.
-
HttpRequest.is_ajax()[source] -
Возвращает
Trueесли запрос был выполнен черезXMLHttpRequest, проверяя заголовокHTTP_X_REQUESTED_WITHна наличие строки'XMLHttpRequest'. Большинство современных библиотек JavaScript отправляют этот заголовок. Если вы пишете свой собственныйXMLHttpRequestвызов (на стороне браузера), вам нужно будет установить этот заголовок вручную, если вы хотите, чтобыis_ajax()работал.Если ответ зависит от того, запрашивается ли он через AJAX, и вы используете какой-либо кеширование, например, кеширование Django
cache middleware, вам следует декорировать представление с помощьюvary_on_headers('X-Requested-With'), чтобы ответы были должным образом кэшированы.
-
HttpRequest.read(size=None)[source]
-
HttpRequest.readline()[source]
-
HttpRequest.readlines()[source]
-
HttpRequest.__iter__()[source] -
Методы, реализующие интерфейс, похожий на файловый, для чтения из экземпляра
HttpRequest. Это позволяет обрабатывать входящий запрос в потоковом режиме. Типичным случаем использования является обработка большого XML-данных с помощью итерационного парсера, не создавая целого XML-дерева в памяти.Учитывая этот стандартный интерфейс, экземпляр
HttpRequestможет быть передан напрямую парсеру XML, например,ElementTree:import xml.etree.ElementTree as ET for element in ET.iterparse(request): process(element)
QueryDict объекты
-
class QueryDict[source]
В объекте HttpRequest, атрибуты GET и POST являются экземплярами django.http.QueryDict, класса, подобного словарю, настроенного для обработки нескольких значений для одного ключа. Это необходимо, потому что некоторые элементы HTML-форм, в частности <select multiple>, передают несколько значений для одного ключа.
QueryDict в request.POST и request.GET будут неизменяемыми при обращении в обычном цикле запроса/ответа. Чтобы получить изменяемую версию, вам нужно использовать QueryDict.copy().
Методы
QueryDict реализует все стандартные методы словаря, потому что это подкласс словаря. Исключениеs описаны здесь:
-
QueryDict.__init__(query_string=None, mutable=False, encoding=None)[source] -
Инициализирует объект
QueryDictна основеquery_string.>>> QueryDict('a=1&a=2&c=3') <QueryDict: {'a': ['1', '2'], 'c': ['3']}>Если
query_stringне передан, получившийсяQueryDictбудет пустым (у него не будет ключей или значений).Большинство
QueryDicts, которые вы встречаете, и в частности те, что вrequest.POSTиrequest.GET, будут неизменяемыми. Если вы инициализируете его самостоятельно, вы можете сделать его изменяемым, передавmutable=Trueв его__init__().Строки для установки ключей и значений будут преобразованы из
encodingвstr. Еслиencodingне задан, он по умолчанию равенDEFAULT_CHARSET.
-
classmethod QueryDict.fromkeys(iterable, value='', mutable=False, encoding=None)[source] -
Создает новый
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)[source] -
Устанавливает данный ключ в
[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)[source] -
Аналогично
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()[source] -
Возвращает копию объекта с использованием
copy.deepcopy(). Эта копия будет изменяемой, даже если оригинальная не была.
-
QueryDict.getlist(key, default=None) -
Возвращает список данных с запрошенным ключом. Возвращает пустой список, если ключ не существует и значение по умолчанию не было предоставлено. Гарантируется, что возвращается список, если значение по умолчанию, предоставленное, не является списком.
-
QueryDict.setlist(key, list_)[source] -
Устанавливает данный ключ в
list_(в отличие от__setitem__()).
-
QueryDict.appendlist(key, item)[source] -
Добавляет элемент в внутренний список, связанный с ключом.
-
QueryDict.setlistdefault(key, default_list=None)[source] -
Аналогично
setdefault(), за исключением того, что он принимает список значений вместо одного значения.
-
QueryDict.lists() -
Аналогично
items(), но включает все значения в виде списка для каждого элемента словаря. Например:>>> q = QueryDict('a=1&a=2&a=3') >>> q.lists() [('a', ['1', '2', '3'])]
-
QueryDict.pop(key)[source] -
Возвращает список значений для данного ключа и удаляет их из словаря. Вызывает
KeyError, если ключ не существует. Например:>>> q = QueryDict('a=1&a=2&a=3', mutable=True) >>> q.pop('a') ['1', '2', '3']
-
QueryDict.popitem()[source] -
Удаляет произвольный элемент словаря (поскольку нет понятия порядка) и возвращает кортеж из двух значений, содержащий ключ и список всех значений для ключа. Вызывает
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)[source] -
Возвращает строку данных в формате строки запроса. Например:
>>> 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[source]
В отличие от объектов 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 = HttpResponse(b'Bytestrings are also accepted.')
Но если вы хотите добавлять контент постепенно, вы можете использовать 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, так как эти поля могут иметь несколько значений, разделенных запятыми. Методы «патча» гарантируют, что другие значения, например, добавленные посредником, не будут удалены.
Поля заголовков 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 -
Строка, обозначающая кодировку символов, в которой будет закодирован ответ. Если не задано при создании объекта, она будет извлечена из
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.Этот атрибут существует для того, чтобы посредники могли по-разному обрабатывать потоковые ответы.
-
HttpResponse.closed -
True, если ответ закрыт.
Методы
-
HttpResponse.__init__(content=b'', content_type=None, status=200, reason=None, charset=None)[source] -
Инициализирует объект
HttpResponseзаданным содержимым страницы и типом контента.contentчаще всего является итератором, строкой байтов или строкой. Другие типы будут преобразованы в строку байтов путём кодирования их строкового представления. Итераторы должны возвращать строки или строки байтов, которые будут объединены для формирования содержимого ответа.content_type— тип MIME, который дополняется необязательно набором символов кодирования и используется для заполнения HTTP-заголовкаContent-Type. Если он не указан, он формируется на основе настроекDEFAULT_CONTENT_TYPEиDEFAULT_CHARSET, по умолчанию: “text/html; charset=utf-8”.status— код состояния HTTP для ответа. Вы можете использовать алиасы из Pythonhttp.HTTPStatus, такие какHTTPStatus.NO_CONTENT.reason— фраза HTTP-ответа. Если она не указана, будет использоваться фраза по умолчанию.charset— набор символов, в котором будет закодирован ответ. Если не указан, он будет извлечен изcontent_type, а если это не удастся, будет использована настройкаDEFAULT_CHARSET.
-
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 будет доступен только для домена, который его установил. -
Используйте
httponly=Trueесли вы хотите предотвратить доступ к cookie со стороны JavaScript на стороне клиента.HttpOnly — флаг, включенный в заголовок HTTP ответа Set-Cookie. Он входит в стандарт RFC 6265 для cookie и может быть полезным для снижения риска доступа скрипта на стороне клиента к защищенным данным cookie.
- Используйте
samesite='Strict'илиsamesite='Lax'чтобы сообщить браузеру не отправлять cookie при выполнении запроса с другого домена. SameSite не поддерживается всеми браузерами, поэтому это не замена защиты CSRF Django, а мера защиты на разных уровнях.
Изменено в Django 2.1:Был добавлен аргумент
samesite.Предупреждение
RFC 6265 гласит, что пользовательские агенты должны поддерживать cookie размером не менее 4096 байт. Для многих браузеров это также максимальный размер. Django не будет выбрасывать исключение, если есть попытка сохранить cookie размером более 4096 байт, но многие браузеры не установят cookie корректно.
-
-
Как и
set_cookie(), но с криптографическим шифрованием cookie перед установкой. Используется в сочетании сHttpRequest.get_signed_cookie(). Вы можете использовать необязательный аргументsaltдля повышения силы ключа, но вам нужно будет передать его соответствующему вызовуHttpRequest.get_signed_cookie().
-
Удаляет cookie с заданным ключом. Без ошибок, если ключ не существует.
Из-за того, как работают cookie,
pathиdomainдолжны иметь те же значения, что и вset_cookie(), иначе cookie может не быть удален.Изменено в Django 2.2.15:Был добавлен аргумент
samesite.
-
HttpResponse.close() -
Этот метод вызывается в конце запроса непосредственно сервером WSGI.
-
HttpResponse.write(content)[source] -
Этот метод делает экземпляр
HttpResponseобъектом типа файл.
-
HttpResponse.flush() -
Этот метод делает экземпляр
HttpResponseобъектом типа файл.
-
HttpResponse.tell()[source] -
Этот метод делает экземпляр
HttpResponseобъектом типа файл.
-
HttpResponse.getvalue()[source] -
Возвращает значение
HttpResponse.content. Этот метод делает экземплярHttpResponseобъектом типа поток.
-
HttpResponse.readable() -
Всегда
False. Этот метод делает экземплярHttpResponseобъектом типа поток.
-
HttpResponse.seekable() -
Всегда
False. Этот метод делает экземплярHttpResponseобъектом типа поток.
-
HttpResponse.writable()[source] -
Всегда
True. Этот метод делает экземплярHttpResponseобъектом типа поток.
-
HttpResponse.writelines(lines)[source] -
Записывает список строк в ответ. Разделители строк не добавляются. Этот метод делает экземпляр
HttpResponseобъектом типа поток.
HttpResponse подклассы
Django включает несколько HttpResponse подклассов, которые обрабатывают различные типы HTTP-ответов. Подобно HttpResponse, эти подклассы находятся в django.http.
-
class HttpResponseRedirect[source] -
Первый аргумент конструктора обязателен – путь для перенаправления. Это может быть полностью квалифицированный URL (например,
'https://www.yahoo.com/search/'), абсолютный путь без домена (например,'/search/') или даже относительный путь (например,'search/'). В последнем случае браузер клиента сам восстановит полный URL в соответствии с текущим путем. См.HttpResponseдля других необязательных аргументов конструктора. Обратите внимание, что это возвращает код состояния HTTP 302.-
url -
Это только для чтения атрибут, представляющий URL, на который будет перенаправлен ответ (эквивалентен заголовку ответа
Location).
-
-
class HttpResponsePermanentRedirect[source] -
Как
HttpResponseRedirect, но возвращает постоянное перенаправление (код состояния HTTP 301) вместо перенаправления «найден» (код состояния 302).
-
class HttpResponseNotModified[source] -
Конструктор не принимает никаких аргументов, и к этому ответу не должно добавляться никакого содержимого. Используйте этот метод для обозначения того, что страница не изменялась с момента последнего запроса пользователя (код состояния 304).
-
class HttpResponseBadRequest[source] -
Ведёт себя как
HttpResponse, но использует код состояния 400.
-
class HttpResponseNotFound[source] -
Ведёт себя как
HttpResponse, но использует код состояния 404.
-
class HttpResponseForbidden[source] -
Ведёт себя как
HttpResponse, но использует код состояния 403.
-
class HttpResponseNotAllowed[source] -
Как
HttpResponse, но использует код состояния 405. Первый аргумент конструктора обязателен: список разрешенных методов (например,['GET', 'POST']).
-
class HttpResponseGone[source] -
Ведёт себя как
HttpResponse, но использует код состояния 410.
-
class HttpResponseServerError[source] -
Ведёт себя как
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)[source] -
Подкласс
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 было возможно заразить конструктор JavaScript Array. По этой причине Django по умолчанию не позволяет передавать объекты, не являющиеся словарями, в конструктор JsonResponse. Однако большинство современных браузеров реализуют EcmaScript 5, который устраняет эту уязвимость. Поэтому можно отключить эту меру безопасности.
Изменение кодировщика JSON по умолчанию
Если вам нужен другой класс кодировщика JSON, вы можете передать параметр encoder в метод конструктора:
>>> response = JsonResponse(data, encoder=MyJSONEncoder)
StreamingHttpResponse объекты
-
class StreamingHttpResponse[source]
Класс 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)[source] -
FileResponse— подклассStreamingHttpResponse, оптимизированный для бинарных файлов. Использует wsgi.file_wrapper, если он предоставлен сервером WSGI, в противном случае он передает файл небольшими порциями.Если
as_attachment=True, заголовокContent-Dispositionустанавливается, что запрашивает от браузера предложить пользователю файл для скачивания.Если
open_fileне имеет имени или имяopen_fileне подходит, предоставьте пользовательское имя файла с помощью параметраfilename. Обратите внимание, что если вы передаете объект похожий на файл, например,io.BytesIO, вам необходимоseek()его перед передачей вFileResponse.Заголовки
Content-Length,Content-Type, иContent-Dispositionавтоматически устанавливаются, когда они могут быть определены из содержимогоopen_file.Добавлено в Django 2.1:Были добавлены ключевые аргументы
as_attachmentиfilename. Также,FileResponseустанавливает заголовкиContentесли может их определить.
FileResponse принимает любой объект, похожий на файл, с бинарным содержимым, например, файл, открытый в бинарном режиме, так:
>>> from django.http import FileResponse
>>> response = FileResponse(open('myfile.png', 'rb'))
Файл будет закрыт автоматически, поэтому не открывайте его с помощью менеджера контекста.
Методы
-
FileResponse.set_headers(open_file)[source] -
Добавлено в Django 2.1.
Этот метод вызывается автоматически во время инициализации ответа и устанавливает различные заголовки (
Content-Length,Content-Type, иContent-Disposition) в зависимости отopen_file.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/2.2/ref/request-response/