Объекты запроса и ответа
Краткий обзор
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.GET -
Объект, похожий на словарь, содержащий все предоставленные HTTP-параметры GET. См. документацию по
QueryDictниже.
-
HttpRequest.POST -
Объект, похожий на словарь, содержащий все предоставленные HTTP-параметры POST, при условии, что запрос содержит данные формы. См. документацию по
QueryDictниже. Если вам нужно получить доступ к сырым или неформатированным данным, отправленным в запросе, обратитесь к атрибутуHttpRequest.bodyвместо этого.Возможен случай, когда запрос может прийти по POST с пустым словарем
POST, например, если форма запрошена по методу POST HTTP, но не содержит данных формы. Поэтому не следует использоватьif request.POSTдля проверки использования метода POST; вместо этого используйтеif request.method == "POST"(см. выше).Примечание:
POSTне включает информацию о загрузке файлов. См.FILES.
-
HttpRequest.COOKIES -
Стандартный словарь Python, содержащий все cookie. Ключи и значения являются строками.
-
HttpRequest.FILES -
Объект, похожий на словарь, содержащий все загруженные файлы. Каждый ключ в
FILES— это имя файла изname, отправленного в<input type="file" name="" />. Каждое значение вFILES— это объектUploadedFile.См. Управление файлами для получения дополнительной информации.
Обратите внимание, что
FILESбудет содержать данные только в том случае, если метод запроса был POST, и форма, отправленная в запрос, содержала<form>. В противном случаеFILESбудет пустым объектом, похожим на словарь.
-
HttpRequest.META -
Стандартный словарь Python, содержащий все доступные HTTP-заголовки. Доступные заголовки зависят от клиента и сервера, но вот некоторые примеры:
-
CONTENT_LENGTH— Длина тела запроса (как строка). -
CONTENT_TYPE— MIME-тип тела запроса. -
HTTP_ACCEPT— Допустимые типы содержимого для ответа. -
HTTP_ACCEPT_ENCODING— Допустимые кодировки для ответа. -
HTTP_ACCEPT_LANGUAGE— Допустимые языки для ответа. -
HTTP_HOST— Заголовок HTTP Host, отправленный клиентом. -
HTTP_REFERER— Ссылающаяся страница, если она есть. -
HTTP_USER_AGENT— Строка user-agent клиента. -
QUERY_STRING— Строка запроса, как одна (необработанная) строка. -
REMOTE_ADDR— IP-адрес клиента. -
REMOTE_HOST— Имя хоста клиента. -
REMOTE_USER— Пользователь, авторизованный веб-сервером, если таковой есть. -
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, то есть он доступен во всех представлениях, но не в методах промежуточного ПО, которые выполняются до разрешения URL (например, вprocess_request, вы можете использоватьprocess_viewвместо этого).
Атрибуты, установленные кодом приложения
Django не устанавливает эти атрибуты сам, но использует их, если они установлены вашим приложением.
-
HttpRequest.current_app -
Тег шаблона
urlбудет использовать его значение в качестве аргументаcurrent_appдляreverse().
-
HttpRequest.urlconf -
Он будет использоваться как корневой URLconf для текущего запроса, переопределяя настройку
ROOT_URLCONF. См. Как Django обрабатывает запрос для получения подробностей.urlconfможно установить вNoneдля отмены любых изменений, внесённых предыдущим промежуточным ПО, и возврата к использованиюROOT_URLCONF.Установка
urlconf=NoneвызывалаImproperlyConfiguredв более старых версиях.
Атрибуты, установленные промежуточным ПО
Некоторые из компонентов промежуточного программного обеспечения, включённых в приложения Django contrib, устанавливают атрибуты в запросе. Если вы не видите атрибут в запросе, убедитесь, что соответствующий класс промежуточного программного обеспечения перечислен в MIDDLEWARE_CLASSES.
-
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()терпит неудачу, когда хост находится за несколькими прокси-серверами. Одним из решений является использование промежуточного программного обеспечения для переписывания заголовков прокси, как в следующем примере:class MultipleProxyMiddleware(object): FORWARDED_FOR_FIELDS = [ 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED_HOST', 'HTTP_X_FORWARDED_SERVER', ] def process_request(self, request): """ Rewrites the proxy headers so that only the most recent proxy is used. """ for field in self.FORWARDED_FOR_FIELDS: if field in request.META: if ',' in request.META[field]: parts = request.META[field].split(',') request.META[field] = parts[-1].strip()Этот компонент промежуточного программного обеспечения должен располагаться перед любым другим компонентом промежуточного программного обеспечения, который использует значение
get_host()– например,CommonMiddlewareилиCsrfViewMiddleware.
-
HttpRequest.get_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.
-
Возвращает значение куки для подписанной куки или вызывает исключение
django.core.signing.BadSignature, если подпись больше недействительна. Если вы предоставляете аргументdefault, исключение будет подавлено, и вместо этого будет возвращено это значение по умолчанию.Необязательный аргумент
saltможет быть использован для дополнительной защиты от атак типа «brute-force» на ваш секретный ключ. Если он указан, аргументmax_ageбудет проверено относительно подписанного отметки времени, прикрепленного к значению cookie, для того, чтобы убедиться, что cookie не старше, чемmax_ageсекунд.Например:
>>> request.get_signed_cookie('name') 'Tony' >>> request.get_signed_cookie('name', salt='name-salt') 'Tony' # assuming cookie was set using the same salt >>> request.get_signed_cookie('non-existing-cookie') ... KeyError: 'non-existing-cookie' >>> request.get_signed_cookie('non-existing-cookie', False) False >>> request.get_signed_cookie('cookie-that-was-tampered-with') ... BadSignature: ... >>> request.get_signed_cookie('name', max_age=60) ... SignatureExpired: Signature age 1677.3839159 > 60 seconds >>> request.get_signed_cookie('name', False, max_age=60) FalseСм. криптографическое подписание для получения дополнительной информации.
-
HttpRequest.is_secure()[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.xreadlines()[source]
-
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[source]
В объекте HttpRequest, атрибуты GET и POST являются экземплярами django.http.QueryDict, класса, подобного словарю, настроенного для обработки нескольких значений для одного ключа. Это необходимо, поскольку некоторые элементы HTML-формы, в частности <select multiple>, передают несколько значений для одного ключа.
Объекты QueryDict в request.POST и request.GET будут неизменяемыми при обращении в обычном цикле запроса/ответа. Чтобы получить изменяемую версию, необходимо использовать .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в unicode. Если кодировка не задана, она по умолчанию равнаDEFAULT_CHARSET.В предыдущих версиях
query_stringбыл обязательным позиционным аргументом.
-
QueryDict.__getitem__(key) -
Возвращает значение для заданного ключа. Если ключ имеет более одного значения,
__getitem__()возвращает последнее значение. Вызываетdjango.utils.datastructures.MultiValueDictKeyErrorесли ключ не существует. (Это подкласс стандартного словаря Python, поэтому вы можете использовать стандартное обращение сKeyError.)
-
QueryDict.__setitem__(key, value)[source] -
Устанавливает заданный ключ в
[value](список Python, содержащий единственный элементvalue). Обратите внимание, что это, как и другие функции словаря, влияющие на состояние, может быть вызвано только на изменяемом объектеQueryDict(например, созданном черезcopy()).
-
QueryDict.__contains__(key) -
Возвращает
Trueесли заданный ключ установлен. Это позволяет вам выполнять, например,if "foo" in request.GET.
-
QueryDict.get(key, default=None) -
Использует ту же логику, что и
__getitem__()выше, с возможностью возвращения значения по умолчанию, если ключ не существует.
-
QueryDict.setdefault(key, default=None)[source] -
Аналогично стандартному методу словаря
setdefault(), за исключением использования__setitem__()внутри.
-
QueryDict.update(other_dict) -
Принимает либо
QueryDict, либо стандартный словарь. Аналогично методу стандартного словаряupdate(), за исключением того, что он *добавляет* к текущим элементам словаря, а не заменяет их. Например:>>> q = QueryDict('a=1', mutable=True) >>> q.update({'a': '2'}) >>> q.getlist('a') ['1', '2'] >>> q['a'] # returns the last '2'
-
QueryDict.items() -
Аналогично стандартному методу словаря
items(), за исключением того, что он использует ту же логику последнего значения, что и__getitem__(). Например:>>> q = QueryDict('a=1&a=2&a=3') >>> q.items() [('a', '3')]
-
QueryDict.iteritems() -
Аналогично стандартному методу словаря
iteritems()метода. Как иQueryDict.items(), он использует ту же логику последнего значения, что иQueryDict.__getitem__().
-
QueryDict.iterlists() -
Аналогично
QueryDict.iteritems(), за исключением того, что включает все значения в виде списка для каждого элемента словаря.
-
QueryDict.values() -
Аналогично стандартному методу словаря
values(), за исключением того, что он использует ту же логику последнего значения, что и__getitem__(). Например:>>> q = QueryDict('a=1&a=2&a=3') >>> q.values() ['3']
-
QueryDict.itervalues() -
Аналогично
QueryDict.values(), но как итератор.
Кроме того, у QueryDict есть следующие методы:
-
QueryDict.copy()[source] -
Возвращает копию объекта, используя
copy.deepcopy()из стандартной библиотеки Python. Эта копия будет изменяемой, даже если исходный объект не был.
-
QueryDict.getlist(key, default=None) -
Возвращает данные с запрошенным ключом в виде списка Python. Возвращает пустой список, если ключ не существует и значение по умолчанию не было предоставлено. Гарантируется, что будет возвращен список, если предоставленное значение по умолчанию не является списком.
-
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'В urlencode можно необязательно передавать символы, которые не требуют кодирования. Например:
>>> 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 немедленно обработает итератор, сохранит его содержимое в виде строки и удалит его.
Если вам нужно, чтобы ответ передавался по потоку от итератора клиенту, вы должны использовать класс 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 -
Строка байтов, представляющая содержимое, закодированная из объекта Unicode, если необходимо.
-
HttpResponse.charset -
Строка, обозначающая кодировку символов, в которой будет закодирован ответ. Если не указано при создании экземпляра, оно будет извлечено из
content_typeи, если это не удастся, будет использовано значение настройкиDEFAULT_CHARSET.
-
HttpResponse.status_code -
Код состояния HTTP для ответа.
Если
reason_phraseне задан явно, изменение значенияstatus_codeвне конструктора также изменит значениеreason_phrase.
-
HttpResponse.reason_phrase -
Фраза состояния HTTP для ответа.
reason_phraseбольше не по умолчанию все заглавные буквы. Теперь он использует значения фраз состояния по умолчанию стандарта 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.Параметр
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=".lawrence.com"установит cookie, который может считываться доменами www.lawrence.com, blogs.lawrence.com и calendars.lawrence.com. В противном случае cookie будет доступен только для домена, который его установил. -
Используйте
httponly=True, если вы хотите предотвратить доступ скрипта JavaScript на стороне клиента к cookie.HTTPOnly — это флаг, включённый в заголовок ответа HTTP Set-Cookie. Он не входит в стандарт RFC 2109 для cookies, и он не поддерживается всеми браузерами одинаково. Однако, когда он поддерживается, он может быть полезным способом минимизации риска доступа защищенных данных cookie со стороны скрипта на стороне клиента.
Предупреждение
Как RFC 2109, так и RFC 6265 указывают, что пользовательские агенты должны поддерживать cookies размером не менее 4096 байт. Для многих браузеров это также максимальный размер. Django не будет генерировать исключение, если будет попытка сохранить cookie размером более 4096 байт, но многие браузеры не будут правильно устанавливать cookie.
-
-
Аналогично
set_cookie(), но шифрует cookie перед его установкой. Используйте в сочетании сHttpRequest.get_signed_cookie(). Вы можете использовать необязательный аргументsaltдля увеличения силы ключа, но вам нужно будет помнить, что передавать его в соответствующий вызовHttpRequest.get_signed_cookie().
-
Удаляет cookie с заданным ключом. Если ключ не существует, завершается без ошибок.
Из-за того, как работают cookie,
pathиdomainдолжны быть такими же значениями, которые вы использовали вset_cookie()— в противном случае cookie может не быть удалён.
-
HttpResponse.write(content)[source] -
Этот метод делает экземпляр
HttpResponseобъектом, похожим на файл.
-
HttpResponse.flush() -
Этот метод делает экземпляр
HttpResponseобъектом, похожим на файл.
-
HttpResponse.tell()[source] -
Этот метод делает экземпляр
HttpResponseобъектом, похожим на файл.
-
HttpResponse.getvalue()[source] -
Возвращает значение
HttpResponse.content. Этот метод делает экземпляр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 сам должен возвращать допустимый объект ответа.
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()для создания ответа.Аргумент
json_dumps_paramsбыл добавлен.
Использование
Типичное использование может выглядеть так:
>>> 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 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 для ответа. (HTTP status code).
Если
reason_phraseявно не задан, изменение значенияstatus_codeвне конструктора также изменит значениеreason_phrase.
-
StreamingHttpResponse.reason_phrase -
Фраза причины HTTP для ответа.
reason_phraseбольше не по умолчанию в верхнем регистре. Теперь он использует значения по умолчанию из стандарта 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/1.9/ref/request-response/