Объекты ответа и запроса¶
Быстрый обзор¶
Django использует объекты ответа и запроса, чтобы передавать состояние в системе.
Когда запрашивает страница, Django создает объект HttpRequest, который содержит различные данные о запросе. Потом Django определяет и загружает необходимое представление и вызывает его передавая объект HttpRequest первым аргументом. Каждое представление должно вернуть объект HttpResponse.
Этот раздел описывает API объектов HttpRequest и HttpResponse, которые определены в модуле django.http.
Объект HttpRequest¶
- class HttpRequest¶
Атрибуты¶
Все атрибуты должны рассматриваться как неизменяемые, пока об обратном не будет сказано явно.
- HttpRequest.scheme¶
Строка, указывающая схему запроса (обычно
httpилиhttps).
- HttpRequest.body¶
Тело запроса HTTP в байтовой строке. Он полезен для обработки данных различными способами, а не только традиционной HTML формой: передача изображений, загрузка XML и др. Для обработки данных обычной формы, используйте
HttpRequest.POST.Вы также можете читать из HttpRequest, используя файловый интерфейс с
HttpRequest.read()илиHttpRequest.readline(). Доступ к атрибуту body после чтения запроса с помощью любого из этих методов потока ввода-вывода приведет к возникновению исключения RawPostDataException.
- HttpRequest.path¶
A string representing the full path to the requested page, not including the scheme or domain.
Например:
"/music/bands/the_beatles/"
- HttpRequest.path_info¶
В некоторых конфигурациях веб-сервера часть URL-адреса после имени хоста разделяется на часть префикса сценария и часть информации о пути. Атрибут 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¶
Строка, указывающая схему запроса (обычно
httpилиhttps).
- HttpRequest.content_params¶
Словарь параметров ключ/значение, включенный в заголовок CONTENT_TYPE.
- HttpRequest.GET¶
Объект с интерфейсом словаря, который содержит HTTP GET параметры. Смотрите описание
QueryDictниже.
- HttpRequest.POST¶
Объект-словарь содержащий все 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>содержалenctype="multipart/form-data". В другом случае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будет добавлен вMETAс ключомHTTP_X_BENDER.Обратите внимание, что
runserverудаляет все заголовки с подчеркиваниями в имени, поэтому вы не увидите их вMETA. Это предотвращает подмену заголовка, основанную на неоднозначности между подчеркиваниями и тире, которые нормализуются на подчеркивания в переменных среды WSGI. Оно соответствует поведению веб-серверов, таких как Nginx и Apache 2.4+.HttpRequest.headers— это более простой способ доступа ко всем заголовкам с префиксом HTTP, а такжеCONTENT_LENGTHиCONTENT_TYPE.
- HttpRequest.headers¶
Нечувствительный к регистру объект, подобный dict, который обеспечивает доступ ко всем заголовкам с префиксом HTTP (плюс Content-Length и Content-Type) из запроса.
The name of each header is stylized with title-casing (e.g.
User-Agent) when it’s displayed. You can access headers case-insensitively:>>> request.headers {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6', ...} >>> 'User-Agent' in request.headers True >>> 'user-agent' in request.headers True >>> request.headers['User-Agent'] Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) >>> request.headers['user-agent'] Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) >>> request.headers.get('User-Agent') Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) >>> request.headers.get('user-agent') Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
For use in, for example, Django templates, headers can also be looked up using underscores in place of hyphens:
{{ request.headers.user_agent }}
Changed in Django 3.0:Support for lookups using underscores was added.
- HttpRequest.resolver_match¶
Экземпляр
ResolverMatchпредставляющий запрошенный URL. Атрибут устанавливается при поиске подходящего URL-шаблона, это значит что middleware он не доступен т.к. они вызывается до обработки URL-а (в таком случае вместоprocess_requestможно использоватьprocess_view).
Атрибуты, которые могут добавляться кодом приложения¶
Django не устанавливает эти атрибуты, но использует их, если ваше приложение установит их.
- HttpRequest.current_app¶
Шаблонный тег
urlбудет использовать значение этого атрибута как аргументcurrent_appдляreverse().
- HttpRequest.urlconf¶
Будет использоваться как URLconf текущего запроса вместо значения настройки
ROOT_URLCONF. Подробности смотрите в разделе Как Django обрабатывает запрос.urlconfможно установить вNone, чтобы отменить какие-либо изменения, сделанные предыдущими промежуточными слоями, и снова использоватьROOT_URLCONF.
- HttpRequest.exception_reporter_filter¶
Это будет использоваться вместо
DEFAULT_EXCEPTION_REPORTER_FILTERдля текущего запроса. Подробности смотрите в Настройка отчета об ошибке.
- HttpRequest.exception_reporter_class¶
Это будет использоваться вместо
DEFAULT_EXCEPTION_REPORTERдля текущего запроса. Подробности смотрите в Настройка отчета об ошибке.
Атрибуты, которые устанавливаются промежуточным слоем(middleware)¶
Некоторые промежуточные слои, включая встроенные в Django, добавляют атрибуты к объекту запроса. Если вы не нашли атрибут в объекте запроса, убедитесь, что нужный промежуточный слой добавлен в MIDDLEWARE_CLASSES.
- HttpRequest.session¶
Добавляется
SessionMiddleware: объект с интерфейсом словаря, который содержит текущую сессию.
- HttpRequest.site¶
Добавляется
CurrentSiteMiddleware: экземплярSiteилиRequestSite, который возвращаетсяget_current_site(), отображает текущий сайт.
- HttpRequest.user¶
Добавляется
AuthenticationMiddleware: содержит объектAUTH_USER_MODELпредставляющий текущего пользователя. Если пользователь не авторизирован, атрибутuserбудет содержатьdjango.contrib.auth.models.AnonymousUser. Вы можете различить их используяis_authenticated():if request.user.is_authenticated: ... # Do something for logged-in users. else: ... # Do something for anonymous users.
Методы¶
- HttpRequest.get_host()¶
Возвращает оригинальное имя хоста используя информацию из
HTTP_X_FORWARDED_HOST(если включена настройкаUSE_X_FORWARDED_HOST) иHTTP_HOSTзаголовков, в соответствующем порядке. Если эти значения не определенны, метод использует комбинациюSERVER_NAMEиSERVER_PORTкак описано в PEP 3333.Например:
"127.0.0.1:8000"Примечание
Метод
get_host()вернет ошибку если сервер находится за несколькими proxy. Одно из решений – создать функциональный слой(middleware), который переопределить заголовки proxy таким образом:class MultipleProxyMiddleware: FORWARDED_FOR_FIELDS = [ 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED_HOST', 'HTTP_X_FORWARDED_SERVER', ] def __init__(self, get_response): self.get_response = get_response def __call__(self, request): """ Rewrites the proxy headers so that only the most recent proxy is used. """ for field in self.FORWARDED_FOR_FIELDS: if field in request.META: if ',' in request.META[field]: parts = request.META[field].split(',') request.META[field] = parts[-1].strip() return self.get_response(request)
Этот функциональный слой должен находиться перед любый другим, который может использовать
get_host(), например,CommonMiddlewareилиCsrfViewMiddleware.
- HttpRequest.get_port()¶
Возвращает оригинальный порт запроса, используя данные из
HTTP_X_FORWARDED_PORT(если включена настройкаUSE_X_FORWARDED_PORT) и значениеSERVER_PORTизMETAв указанном порядке.
- HttpRequest.get_full_path()¶
Возвращает
path, со строкой запроса, если она присутствует.Например:
"/music/bands/the_beatles/?print=true"
- HttpRequest.get_full_path_info()¶
Аналогично
get_full_path(), но используетpath_infoвместоpath.Например:
"/music/bands/the_beatles/?print=true"
- HttpRequest.build_absolute_uri(location=None)¶
Возвращает абсолютный URI для аргумента
location. Еслиlocationне указан, будет использовано значениеrequest.get_full_path().Если
locationуже является абсолютным 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.
- HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)¶
Возвращает значение подписанных(signed) cookie, или вызывает исключение
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('nonexistent-cookie') ... KeyError: 'nonexistent-cookie' >>> request.get_signed_cookie('nonexistent-cookie', False) False >>> request.get_signed_cookie('cookie-that-was-tampered-with') ... BadSignature: ... >>> request.get_signed_cookie('name', max_age=60) ... SignatureExpired: Signature age 1677.3839159 > 60 seconds >>> request.get_signed_cookie('name', False, max_age=60) False
Подробности смотрите в разделе о криптографической подписи.
- HttpRequest.is_secure()¶
Возвращает
Trueесли запрос безопасный; то есть, если он был выполнен через HTTPS.
- HttpRequest.accepts(mime_type)¶
- New in Django 3.1.
Returns
Trueif the requestAcceptheader matches themime_typeargument:>>> request.accepts('text/html') True
Большинство браузеров по умолчанию отправляют
Accept: */*, поэтому для всех типов контента будет возвращеноTrue. Установка явного заголовка Accept в запросах API может быть полезна для возврата другого типа контента только для этих потребителей. См. пример использования «accepts()» для возврата различного контента потребителям API.Если ответ варьируется в зависимости от содержимого заголовка Accept, и вы используете какую-либо форму кэширования, такую как Django
cache middleware, вам следует украсить представлениеvary_on_headers('Accept'), чтобы ответы правильно кэшировались.
- HttpRequest.is_ajax()¶
Не рекомендуется, начиная с версии 3.1.
Returns
Trueif the request was made via anXMLHttpRequest, by checking theHTTP_X_REQUESTED_WITHheader for the string'XMLHttpRequest'. Most modern JavaScript libraries send this header. If you write your ownXMLHttpRequestcall (on the browser side), you’ll have to set this header manually if you wantis_ajax()to work.If a response varies on whether or not it’s requested via AJAX and you are using some form of caching like Django’s
cache middleware, you should decorate the view withvary_on_headers('X-Requested-With')so that the responses are properly cached.
- HttpRequest.read(size=None)¶
- HttpRequest.readline()¶
- HttpRequest.readlines()¶
- HttpRequest.__iter__()¶
Методы, предоставляющие интерфейс файла для чтения данных из объекта
HttpRequest. Это дает возможность читать содержимое запроса в потоке. Один из вариантов использования – это обработка большого XML-документа «парсером», без создания всего XML-дерева в памяти.Предоставляя стандартный интерфейс, объект
HttpRequestможно передавать непосредственно в XML-парсер такой как ElementTree:import xml.etree.ElementTree as ET for element in ET.iterparse(request): process(element)
Объект QueryDict¶
- class QueryDict¶
В объекте HttpRequest, атрибуты GET и POST являются экземплярами класса django.http.QueryDict – это класс с интерфейсом словаря, который дополнительной хранить несколько значений для одного ключа. Это необходимо так как определенные элементы HTML-форм(например, <select multiple>) передают несколько значений для одного ключа.
QueryDict из request.POST и request.GET – неизменяемы. Чтобы получить изменяемую версию, используйте .copy().
Методы¶
Класс QueryDict представляет все стандартные методы словаря, так как является его подклассом. Исключения описаны здесь:
- QueryDict.__init__(query_string=None, mutable=False, encoding=None)¶
Создает экземпляр
QueryDictизquery_string.>>> QueryDict('a=1&a=2&c=3') <QueryDict: {'a': ['1', '2'], 'c': ['3']}>
Если параметр
query_stringне указан, полученныйQueryDictбудет пустым (без ключей и значений).Большинство объектов
QueryDict, которые используются в Django, в том числеrequest.POSTиrequest.GET, будут неизменяемыми. Если вы создаете экземпляр самостоятельно, можете сделать его изменяемым, передавmutable=Trueв__init__().Строки ключей и значений будут преобразованы в
unicodeс использованиемencoding. Еслиencodingне указан, будет использоваться значениеDEFAULT_CHARSET.
- classmethod QueryDict.fromkeys(iterable, value='', mutable=False, encoding=None)¶
Creates a new
QueryDictwith keys fromiterableand each value equal tovalue. For example:>>> QueryDict.fromkeys(['a', 'a', 'b'], value='val') <QueryDict: {'a': ['val', 'val'], 'b': ['val']}>
- QueryDict.__getitem__(key)¶
Возвращает значение для переданного ключа. Если ключа содержит несколько значений,
__getitem__()возвращает последнее значение. Вызывает исключениеdjango.utils.datastructures.MultiValueDictKeyErrorесли ключ не существует. (Это подкласс стандартного исключения PythonKeyError, так что вы как обычно можете обрабатывать исключениеKeyError.)
- QueryDict.__setitem__(key, value)¶
Устанавливает значения ключа в
[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)¶
Аналогичен методу
setdefault()словаря, но использует метод__setitem__().
- QueryDict.update(other_dict)¶
Takes either a
QueryDictor a dictionary. Likedict.update(), except it appends to the current dictionary items rather than replacing them. For example:>>> q = QueryDict('a=1', mutable=True) >>> q.update({'a': '2'}) >>> q.getlist('a') ['1', '2'] >>> q['a'] # returns the last '2'
- QueryDict.items()¶
Like
dict.items(), except this uses the same last-value logic as__getitem__()and returns an iterator object instead of a view object. For example:>>> q = QueryDict('a=1&a=2&a=3') >>> list(q.items()) [('a', '3')]
- QueryDict.values()¶
Like
dict.values(), except this uses the same last-value logic as__getitem__()and returns an iterator instead of a view object. For example:>>> q = QueryDict('a=1&a=2&a=3') >>> list(q.values()) ['3']
В дополнение, QueryDict содержит такие методы:
- QueryDict.copy()¶
Возвращает копию объекта, используя
copy.deepcopy()из стандартных библиотек Python. Копия будет изменяемая, даже если оригинал не был.
- QueryDict.getlist(key, default=None)¶
Возвращает список данных с запрошенным ключом. Возвращает пустой список, если ключ не существует и значение по умолчанию — None. Он гарантированно возвращает список, если только указанное значение по умолчанию не является списком.
- QueryDict.setlist(key, list_)¶
Устанавливает значение ключа в список
list_(в отличии от__setitem__()).
- QueryDict.appendlist(key, item)¶
Добавляет элемент во внутренний список значений ключа.
- QueryDict.setlistdefault(key, default_list=None)¶
Аналогичен
setdefault, но принимает список значений, а не одно значение.
- QueryDict.lists()¶
Like
items(), except it includes all values, as a list, for each member of the dictionary. For example:>>> q = QueryDict('a=1&a=2&a=3') >>> q.lists() [('a', ['1', '2', '3'])]
- QueryDict.pop(key)¶
Returns a list of values for the given key and removes them from the dictionary. Raises
KeyErrorif the key does not exist. For example:>>> q = QueryDict('a=1&a=2&a=3', mutable=True) >>> q.pop('a') ['1', '2', '3']
- QueryDict.popitem()¶
Removes an arbitrary member of the dictionary (since there’s no concept of ordering), and returns a two value tuple containing the key and a list of all values for the key. Raises
KeyErrorwhen called on an empty dictionary. For example:>>> q = QueryDict('a=1&a=2&a=3', mutable=True) >>> q.popitem() ('a', ['1', '2', '3'])
- QueryDict.dict()¶
Returns a
dictrepresentation ofQueryDict. For every (key, list) pair inQueryDict,dictwill have (key, item), where item is one element of the list, using the same logic asQueryDict.__getitem__():>>> q = QueryDict('a=1&a=3&a=5') >>> q.dict() {'a': '5'}
- QueryDict.urlencode(safe=None)¶
Returns a string of the data in query string format. For example:
>>> q = QueryDict('a=2&b=3&b=5') >>> q.urlencode() 'a=2&b=3&b=5'
Use the
safeparameter to pass characters which don’t require encoding. For example:>>> q = QueryDict(mutable=True) >>> q['next'] = '/a&b/' >>> q.urlencode(safe='/') 'next=/a%26b/'
Объект HttpResponse¶
- class HttpResponse¶
В отличии от объекта HttpRequest, который создается Django, объект HttpResponse создаете вы. Каждое представление должно создать и вернуть объект HttpResponse.
Класс HttpResponse находится в модуле django.http.
Использование¶
Передача строки¶
Typical usage is to pass the contents of the page, as a string, bytestring,
or memoryview, to the HttpResponse constructor:
>>> from django.http import HttpResponse
>>> response = HttpResponse("Here's the text of the Web page.")
>>> response = HttpResponse("Text only, please.", content_type="text/plain")
>>> response = HttpResponse(b'Bytestrings are also accepted.')
>>> response = HttpResponse(memoryview(b'Memoryview as well.'))
Support for memoryview was added.
But if you want to add content incrementally, you can use response as a
file-like object:
>>> 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.
Установка заголовков¶
To set or remove a header field in your response, treat it like a dictionary:
>>> response = HttpResponse()
>>> response['Age'] = 120
>>> del response['Age']
Note that unlike a dictionary, del doesn’t raise KeyError if the header
field doesn’t exist.
Для установки заголовков Cache-Control и Vary, лучше использовать функции patch_cache_control() и patch_vary_headers() из модуля django.utils.cache, так как эти поля могут содержать несколько значений, разделенных запятыми. Эти функции добавят новые значение не удаляя существующие.
HTTP заголовки не могут содержать перенос строки. При попытке добавить заголовок содержащий символ переноса строки (CR или LF) будет вызвано исключение BadHeaderError
Указываем браузеру воспринимать ответ как вложенный файл¶
To tell the browser to treat the response as a file attachment, use the
content_type argument and set the Content-Disposition header. For example,
this is how you might return a Microsoft Excel spreadsheet:
>>> 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¶
Кодировка, в которую будет закодирован ответ. Если не указана во время создания объекта
HttpResponse, будет проверятсяcontent_type, и если не будет найдена, будет использоваться значение настройкиDEFAULT_CHARSET.
- HttpResponse.status_code¶
The HTTP status code for the response.
Если
reason_phraseне установлен явно, изменениеstatus_codeвне конструктора также изменитreason_phrase.
- HttpResponse.reason_phrase¶
The HTTP reason phrase for the response. It uses the HTTP standard’s default reason phrases.
Если не указан явно,
reason_phraseопределяется из текущего значенияstatus_code.
- HttpResponse.streaming¶
Всегда
False.Указывает middleware, что этот ответ потоковый и его нужно обрабатывать не так, как обычные запросы.
- HttpResponse.closed¶
True, если ответ был закрыт.
Методы¶
- HttpResponse.__init__(content=b'', content_type=None, status=200, reason=None, charset=None)¶
Instantiates an
HttpResponseobject with the given page content and content type.contentчаще всего представляет собой итератор, байтовую строку,memoryviewили строку. Другие типы будут преобразованы в байтовую строку путем кодирования их строкового представления. Итераторы должны возвращать строки или байтовые строки, и они будут объединены вместе, чтобы сформировать содержимое ответа.content_type— это тип MIME, дополнительно дополненный кодировкой набора символов, и используется для заполнения HTTP-заголовкаContent-Type. Если не указано, он формируется из'text/html'и настроекDEFAULT_CHARSET, по умолчанию:"text/html; charset=utf-8".statusis the HTTP status code for the response. You can use Python’shttp.HTTPStatusfor meaningful aliases, such asHTTPStatus.NO_CONTENT.reason– это описание HTTP ответа. Если не указано, будет использоваться стандартное значение.charset- кодировка, в которую будет закодирован ответ. Если не указана во время создания объектаHttpResponse, будет проверятсяcontent_type, и если не будет найдена, будет использоваться значение настройкиDEFAULT_CHARSET.Changed in Django 3.0:Support for
memoryviewcontentwas added.
- HttpResponse.__setitem__(header, value)¶
Устанавливает заголовок ответа.
headerиvalueдолжны быть строками.
- HttpResponse.__delitem__(header)¶
Удаляет заголовок ответа. Не вызывает исключения, если заголовок не существует. Регистронезависимый.
- HttpResponse.__getitem__(header)¶
Возвращает значение заголовка. Регистрозависимый.
- HttpResponse.get(header, alternate=None)¶
Возвращает значение для данного заголовка или его альтернативное значение, если заголовок не существует.
- HttpResponse.has_header(header)¶
Возвращает
TrueилиFalseв результате регистронезависимого поиска заголовка по указанному названию.
- HttpResponse.items()¶
Действует как
dict.items()для HTTP-заголовков в ответе.
- HttpResponse.setdefault(header, value)¶
Устанавливает заголовок, если он еще не был установлен.
- HttpResponse.set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False, samesite=None)¶
Устанавливает cookie. Аргументы соответствуют аргументам для конструктора объекта
Morselиз стандартных библиотек Python.max_ageshould be a number of seconds, orNone(default) if the cookie should last only as long as the client’s browser session. Ifexpiresis not specified, it will be calculated.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 будут доступны только для текущего домена.Используйте
secure=True, если вы хотите, чтобы файлы cookie отправлялись на сервер только при выполнении запроса по схемеhttps.Используйте
httponly=True, если хотите ограничит доступ клиентского JavaScript к этим cookie.HTTPOnly – это флаг добавляемый в HTTP заголовок Set-Cookie ответа. Он не является частью стандарта RFC 2109, и поддерживается не всеми браузерами. Однако, если он поддерживается, это может быть полезным для уменьшения риска, что клиентский скрипт получит доступа к защищенным данным cookie.
Используйте Samesite=“Strict“`` или
samesite='Lax', чтобы указать браузеру не отправлять этот файл cookie при выполнении запроса между источниками. SameSite поддерживается не всеми браузерами, поэтому это не замена CSRF-защиты Django, а скорее мера глубокоэшелонированной защиты.Используйте
samesite='None'(строка), чтобы явно указать, что этот файл cookie отправляется со всеми односайтовыми и межсайтовыми запросами.
Changed in Django 3.1:Using
samesite='None'(string) was allowed.Предупреждение
Спецификации RFC 2109 и RFC 6265 указывают, что клиент должен поддерживать куки минимального размера 4096 байт. Для большинства браузеров это максимальный размер кук. Django не вызовет исключение, если вы попытаетесь добавить куки больше 4096 байт, но многие браузеры установят их неправильно.
- HttpResponse.set_signed_cookie(key, value, salt='', max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False, samesite=None)¶
Аналогичен
set_cookie(), но использует криптографическую подписаь перед установкой cookie. Используется вместе с методомHttpRequest.get_signed_cookie(). Вы можете использовать не обязательный аргументsaltдля дополнительной защиты, но не забывайте добавлять его при вызовеHttpRequest.get_signed_cookie().Changed in Django 3.1:Using
samesite='None'(string) was allowed.
- HttpResponse.delete_cookie(key, path='/', domain=None, samesite=None)¶
Удаляет cookie. Не вызывает исключения, если cookie не существует.
Учитывая механизм работы cookie, значения
pathиdomainдолжны быть такими же, какие использовались при вызовеset_cookie()– в противном случае cookie могут быть не удалены.Changed in Django 2.2.15:The
samesiteargument was added.
- HttpResponse.close()¶
Этот метод вызывается в конце запроса непосредственно сервером WSGI.
- HttpResponse.write(content)¶
Метод для соблюдения интерфейса объекта файла.
- HttpResponse.flush()¶
Метод для соблюдения интерфейса объекта файла.
- HttpResponse.tell()¶
Метод для соблюдения интерфейса объекта файла.
- HttpResponse.getvalue()¶
Возвращает значение
HttpResponse.content. Этот метод позволяет использоватьHttpResponseкак объект-файл.
- HttpResponse.readable()¶
Всегда
True. Этот метод позволяет использоватьHttpResponseкак объект-файл.
- HttpResponse.seekable()¶
Всегда
True. Этот метод позволяет использоватьHttpResponseкак объект-файл.
- HttpResponse.writable()¶
Всегда
True. Этот метод позволяет использоватьHttpResponseкак объект-файл.
- HttpResponse.writelines(lines)¶
Записывает список строк в ответ. Разделители строк не добавляются. Этот метод позволяет использовать
HttpResponseкак объект-файл.
Подклассы HttpResponse¶
Django содержит несколько подклассов HttpResponse, которые представляют различные типы HTTP ответов. Как и HttpResponse, эти подклассы находятся в модуле django.http.
- class HttpResponseRedirect¶
Конструктор принимает один обязательный аргумент – путь для перенаправления. Это может быть полный URL (например,
'https://www.yahoo.com/search/') или абсолютный путь без домена (например,'/search/'). Дополнительные необязательные аргументы можно найти в описанииHttpResponse. Возвращает код HTTP состояния равный 302.- url¶
Этот атрибут, доступный только для чтения, содержит URL для редиректа (аналог заголовка
Location).
- class HttpResponsePermanentRedirect¶
Аналогичен
HttpResponseRedirect, но возвращает постоянное перенаправление (код HTTP состояния 301) вместо временного перенаправления (код состояния 302).
- class HttpResponseNotModified¶
Конструктор не принимает аргументы и ответ должен быть пустым. Используйте, чтобы указать, что страница не изменилась с прошлого запроса пользователя (код состояния 304).
- class HttpResponseBadRequest¶
Аналогичен
HttpResponseно использует код состояния 400.
- class HttpResponseNotFound¶
Аналогичен
HttpResponseно использует код состояния 404.
- class HttpResponseForbidden¶
Аналогичен
HttpResponseно использует код состояния 403.
- class HttpResponseNotAllowed¶
Аналогичен
HttpResponse, но использует код состояния 405. Обязательный аргумент: список разрешенных методов (например,['GET', 'POST']).
- class HttpResponseGone¶
Аналогичен
HttpResponseно использует код состояния 410.
- class HttpResponseServerError¶
Аналогичен
HttpResponseно использует код состояния 500.
Примечание
Если ваш подкласс HttpResponse содержит метод render, Django воспринимает его как аналог класса SimpleTemplateResponse. Метод render должен возвращать правильный объект ответа.
Подклассы HttpResponse¶
Если вам нужен класс ответа, которого нет в Django, вы можете создать его с помощью http.HTTPStatus. Например:
from http import HTTPStatus
from django.http import HttpResponse
class HttpResponseNoContent(HttpResponse):
status_code = HTTPStatus.NO_CONTENT
Объект JsonResponse¶
- class JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs)¶
Дочерний класс
HttpResponse, который помогает вернуть ответ в JSON. Наследует большую часть поведения родительского класса с некоторыми исключениями:Его заголовок Content-Type по умолчанию имеет значение application/json.
Первый параметр
dataдолжен быть словарем. Если параметрsafeравенFalse(смотрите ниже), может принимать любой объект, который можно преобразовать в JSON.encoder, по умолчанию равенdjango.core.serializers.json.DjangoJSONEncoder, будет использовать для преобразования данных. Подрбности смотрите в JSON сериализации.Параметр
safeпо умолчанию равенTrue. Если равенFalse, можно передать любой объект для преобразования в JSON (иначе – толькоdict). ЕслиsafeравенTrueи передали неdictобъект, будет вызвано исключениеTypeError.Аргумент
json_dumps_paramsсодержит словарь именованных переменных, который передаются вjson.dumps()при генерации ответа.
Использование¶
Typical usage could look like:
>>> from django.http import JsonResponse
>>> response = JsonResponse({'foo': 'bar'})
>>> response.content
b'{"foo": "bar"}'
Преобразование не словарей¶
In order to serialize objects other than dict you must set the safe
parameter to False:
>>> response = JsonResponse([1, 2, 3], safe=False)
При safe=False будет вызвано исключение TypeError.
Предупреждение
Before the 5th edition of ECMAScript
it was possible to poison the JavaScript Array constructor. For this
reason, Django does not allow passing non-dict objects to the
JsonResponse constructor by default. However, most
modern browsers implement EcmaScript 5 which removes this attack vector.
Therefore it is possible to disable this security precaution.
Переопределяем преобразователь в JSON¶
If you need to use a different JSON encoder class you can pass the encoder
parameter to the constructor method:
>>> response = JsonResponse(data, encoder=MyJSONEncoder)
Объекты StreamingHttpResponse¶
- class StreamingHttpResponse¶
The StreamingHttpResponse class is used to stream a response from
Django to the browser. You might want to do this if generating the response
takes too long or uses too much memory. For instance, it’s useful for
generating large CSV files.
О производительности
Django is designed for short-lived requests. Streaming responses will tie a worker process for the entire duration of the response. This may result in poor performance.
Generally speaking, you should perform expensive tasks outside of the request-response cycle, rather than resorting to a streamed response.
StreamingHttpResponse не является подклассом HttpResponse и предоставляет немного другое API. Однако, они очень похожи со следующими отличиями:
It should be given an iterator that yields bytestrings as content.
You cannot access its content, except by iterating the response object itself. This should only occur when the response is returned to the client.
It has no
contentattribute. Instead, it has astreaming_contentattribute.Вы не можете использовать методы объекта файла
tell()илиwrite(). Это вызовет исключение.
StreamingHttpResponse should only be used in situations where it is
absolutely required that the whole content isn’t iterated before transferring
the data to the client. Because the content can’t be accessed, many
middleware can’t function normally. For example the ETag and
Content-Length headers can’t be generated for streaming responses.
Атрибуты¶
- StreamingHttpResponse.streaming_content¶
Итератор содержимого ответа, байтовая строка, закодированная в соответствии с
HttpResponse.charset.
- StreamingHttpResponse.status_code¶
The HTTP status code for the response.
Если
reason_phraseне установлен явно, изменениеstatus_codeвне конструктора также изменитreason_phrase.
- StreamingHttpResponse.reason_phrase¶
The HTTP reason phrase for the response. It uses the HTTP standard’s default reason phrases.
Если не указан явно,
reason_phraseопределяется из текущего значенияstatus_code.
- StreamingHttpResponse.streaming¶
Всегда
True.
Объекты FileResponse¶
- class FileResponse(open_file, as_attachment=False, filename='', **kwargs)¶
FileResponse— это подклассStreamingHttpResponse, оптимизированный для двоичных файлов. Он использует wsgi.file_wrapper, если он предоставляется сервером wsgi, в противном случае он передает файл небольшими порциями.Если as_attachment=True, то заголовку Content-Disposition присваивается значение Attachment, которое запрашивает браузер предложить файл пользователю для загрузки. В противном случае заголовок Content-Disposition со значением inline (по умолчанию в браузере) будет установлен только в том случае, если имя файла доступно.
Если у
open_fileнет имени или если имяopen_fileне подходит, укажите собственное имя файла, используя параметрfilename. Обратите внимание, что если вы передаете файлоподобный объект, например io.BytesIO, ваша задача — искать его() перед передачей в FileResponse.The
Content-LengthandContent-Typeheaders are automatically set when they can be guessed from contents ofopen_file.
FileResponse accepts any file-like object with binary content, for example
a file open in binary mode like so:
>>> from django.http import FileResponse
>>> response = FileResponse(open('myfile.png', 'rb'))
Файл закроется автоматически, поэтому не открывайте его с помощью контекстного менеджера.
Методы¶
- FileResponse.set_headers(open_file)¶
Этот метод автоматически вызывается во время инициализации ответа и устанавливает различные заголовки («Content-Length», «Content-Type» и «Content-Disposition») в зависимости от «open_file».