Объекты запроса и ответа
Краткий обзор
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 -
Объект, подобный словарю, содержащий все переданные параметры GET. См. документацию по
QueryDictниже.
-
HttpRequest.POST -
Объект, подобный словарю, содержащий все переданные параметры POST, при условии, что запрос содержит данные формы. См. документацию по
QueryDictниже. Если вам нужно получить необработанные или не связанные с формой данные, отправленные в запросе, обращайтесь к атрибутуHttpRequest.bodyвместо этого.Возможно, что запрос может поступить по POST с пустым словарем
POST— если, например, форма запрошена через HTTP-метод POST, но не содержит данных формы. Поэтому не следует использоватьif request.POSTдля проверки использования метода POST; вместо этого используйтеif request.method == "POST"(см.HttpRequest.method).POSTне включает информацию о загрузке файлов. См.FILES.
-
HttpRequest.COOKIES -
Словарь, содержащий все cookie. Ключи и значения — строки.
-
HttpRequest.FILES -
Объект, подобный словарю, содержащий все загруженные файлы. Каждый ключ в
FILESявляетсяnameиз<input type="file" name="">Каждый элемент вFILESявляется объектомUploadedFile.См. Управление файлами для получения дополнительной информации.
FILESбудет содержать данные только в том случае, если метод запроса был POST и<form>, отправленный в запрос, содержалenctype="multipart/form-data". В противном случаеFILESбудет пустым объектом, подобным словарю.
-
HttpRequest.META -
Словарь, содержащий все доступные HTTP-заголовки. Доступные заголовки зависят от клиента и сервера, но вот некоторые примеры:
-
CONTENT_LENGTH— Длина тела запроса (как строка). -
CONTENT_TYPE— MIME-тип тела запроса. -
HTTP_ACCEPT— Допустимые типы контента для ответа. -
HTTP_ACCEPT_ENCODING— Допустимые кодировки для ответа. -
HTTP_ACCEPT_LANGUAGE— Допустимые языки для ответа. -
HTTP_HOST— Заголовок HTTP Host, отправленный клиентом. -
HTTP_REFERER— Ссылка на предыдущую страницу, если есть. -
HTTP_USER_AGENT— Строка пользовательского агента клиента. -
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.
Атрибуты, установленные средствами обработки
Некоторые средства обработки, включённые в приложения contrib 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.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-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 будут неизменяемыми при обращении в обычном цикле запроса/ответа. Чтобы получить изменяемую копию, необходимо использовать 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] -
Создаёт новый объект
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 -
Строка, обозначающая кодировку символов, в которой будет закодирован ответ. Если она не задана при создании, она извлекается из
HttpResponse, а если это невозможно, используется значение настройки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, который дополнительно может включать кодировку набора символов и используется для заполнения HTTP-заголовкаContent-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 для cookie, и не поддерживается всеми браузерами. Однако, если он поддерживается, он может быть полезным способом снизить риск доступа защищенных данных cookie со стороны скрипта на стороне клиента.
- Используйте
samesite='Strict'илиsamesite='Lax'чтобы не отправлять данную cookie при выполнении запроса с другого домена. SameSite не поддерживается всеми браузерами, поэтому это не замена защиты CSRF в Django, а скорее мера защиты на нескольких уровнях.
Изменено в Django 2.1:Добавлен параметр
samesite.Предупреждение
И RFC 2109, и 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 может не удалиться.
-
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 сам должен возвращать допустимый объект ответа.
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 следует использовать только в ситуациях, когда абсолютно необходимо, чтобы все содержимое не было обработано перед передачей данных клиенту. Так как к содержимому нельзя обратиться, многие middleware не могут работать нормально. Например, заголовки 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(open_file, as_attachment=False, filename='', **kwargs)[source] -
FileResponse— подклассStreamingHttpResponse, оптимизированный для бинарных файлов. Он использует wsgi.file_wrapper, если он предоставлен сервером WSGI, в противном случае файл передается небольшими частями.Если
as_attachment=True, устанавливается заголовокContent-Disposition, который просит браузер предложить пользователю скачать файл.Если у
open_fileнет имени или имяopen_fileне подходит, укажите имя файла с помощью параметраfilename.Заголовки
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.1/ref/request-response/