Объекты запроса и ответа
Краткое описание
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, если, например, форма запрошена с помощью метода HTTP POST, но не содержит данных формы. Поэтому не следует использовать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.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для отмены любых изменений, внесенных предыдущим средством обработки, и возврата к использованиюROOT_URLCONF.
Атрибуты, установленные средством обработки
Некоторые средства обработки, включённые в приложения Django, устанавливают атрибуты в запросе. Если вы не видите атрибут в запросе, убедитесь, что соответствующий класс средства обработки указан в 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()терпит неудачу, когда хост находится за несколькими прокси. Одним из решений является использование средства обработки для переписывания заголовков прокси, как в следующем примере:from django.utils.deprecation import MiddlewareMixin class MultipleProxyMiddleware(MiddlewareMixin): FORWARDED_FOR_FIELDS = [ 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED_HOST', 'HTTP_X_FORWARDED_SERVER', ] def process_request(self, request): """ Rewrites the proxy headers so that only the most recent proxy is used. """ for field in self.FORWARDED_FOR_FIELDS: if field in request.META: if ',' in request.META[field]: parts = request.META[field].split(',') request.META[field] = parts[-1].strip()Это средство обработки должно быть расположено перед любым другим средством обработки, которое полагается на значение
get_host()– например,CommonMiddlewareилиCsrfViewMiddleware.
-
HttpRequest.get_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.build_absolute_uri(location)[source] -
Возвращает абсолютный URI в форме
location. Если местоположение не предоставлено, местоположение будет установлено вrequest.get_full_path().Если местоположение уже является абсолютным URI, оно не будет изменено. В противном случае абсолютный URI строится с использованием переменных сервера, доступных в этом запросе.
Пример:
"https://example.com/music/bands/the_beatles/?print=true"Примечание
Смешивание 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 реализует все стандартные методы словаря, поскольку является подклассом словаря. Исключение составляют следующие:
-
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будет пустым (без ключей и значений).Большинство объектов
QueryDict, и в частности те, что находятся вrequest.POSTиrequest.GET, будут неизменяемыми. Если вы создаете экземпляр самостоятельно, вы можете сделать его изменяемым, передавmutable=Trueв его метод__init__().Строки для установки ключей и значений будут преобразованы из
encodingвstr. Еслиencodingне указано, по умолчанию используетсяDEFAULT_CHARSET.
-
classmethod QueryDict.fromkeys(iterable, value='', mutable=False, encoding=None)[source] -
Добавлен в Django 1.11.
Создает новый объект
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 как файлоподобный объект:
>>> 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» гарантируют, что другие значения, например, добавленные посредником, не будут удалены.
Поля 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='', content_type=None, status=200, reason=None, charset=None)[source] -
Инициализирует объект
HttpResponseс заданным содержимым страницы и типом содержимого.contentдолжен быть итератором или строкой. Если это итератор, он должен возвращать строки, которые будут объединены для формирования содержимого ответа. Если это не итератор или строка, он будет преобразован в строку при доступе.content_type— тип MIME, необязательно дополненный кодировкой символов, используемый для заполнения заголовка HTTPContent-Type. Если не указан, он формируется из настроекDEFAULT_CONTENT_TYPEиDEFAULT_CHARSETпо умолчанию: “text/html; charset=utf-8”.status— код HTTP-статуса ответа.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 2109 для cookies, и он не поддерживается всеми браузерами. Тем не менее, если он поддерживается, он может быть полезным способом уменьшить риск доступа защищённых данных cookie со стороны клиентской скрипту.
Предупреждение
Как RFC 2109, так и RFC 6265 указывают, что пользовательские агенты должны поддерживать cookie размером не менее 4096 байт. Для многих браузеров это также максимальный размер. Django не будет генерировать исключение, если есть попытка сохранить cookie размером более 4096 байт, но многие браузеры не установят cookie правильно.
-
-
Как
set_cookie(), но с шифровальной подписью куки перед установкой. Используйте вместе сHttpRequest.get_signed_cookie(). Можно использовать необязательный аргументsalt, чтобы повысить безопасность ключа, но вам нужно будет передать его в соответствующий вызовHttpRequest.get_signed_cookie().
-
Удаляет куки с заданным ключом. Без ошибок пропускает, если ключ не существует.
Из-за того, как работают куки,
pathиdomainдолжны быть такими же значениями, которые вы использовали вset_cookie()— иначе куки не удалится.
-
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] -
Первый аргумент конструктора обязателен — путь для перенаправления. Это может быть полная ссылка (например,
'https://www.yahoo.com/search/'), абсолютный путь без домена (например,'/search/'), или даже относительный путь (например,'search/'). В последнем случае браузер клиента сам воссоздаст полную ссылку в соответствии с текущим путем. См.HttpResponseдля других необязательных аргументов конструктора. Обратите внимание, что это возвращает HTTP-код состояния 302.-
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 сам должен возвращать объект валидного ответа.
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 -
Итератор строк, представляющих содержимое.
-
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[source]
FileResponse — подкласс StreamingHttpResponse, оптимизированный для бинарных файлов. Он использует wsgi.file_wrapper, если это поддерживается сервером WSGI, в противном случае он передаёт файл небольшими блоками.
FileResponse ожидает файл, открытый в двоичном режиме, например:
>>> from django.http import FileResponse
>>> response = FileResponse(open('myfile.png', 'rb'))
Файл будет закрыт автоматически, поэтому не используйте его с менеджером контекста.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/2.0/ref/request-response/