Объекты ответа и запроса¶
Быстрый обзор¶
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¶
Строка, представляющая полный путь к запрошенной странице, не включая схему, домен или строку запроса.
Например:
"/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) из запроса.
Имя каждого заголовка при отображении стилизовано с использованием регистра заголовка (например,
User-Agent). Вы можете получить доступ к заголовкам без учета регистра:>>> request.headers {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6', ...} >>> "User-Agent" in request.headers True >>> "user-agent" in request.headers True >>> request.headers["User-Agent"] Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) >>> request.headers["user-agent"] Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) >>> request.headers.get("User-Agent") Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) >>> request.headers.get("user-agent") Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
Для использования, например, в шаблонах Django, заголовки также можно искать, используя подчеркивания вместо дефисов:
{{ request.headers.user_agent }}
- 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.
Метод
auser()делает то же самое, но его можно использовать из асинхронного контекста.
Методы¶
- HttpRequest.auser()¶
- New in Django 5.0.
Из
AuthenticationMiddleware: Coroutine. Возвращает экземплярAUTH_USER_MODEL, представляющий текущего вошедшего в систему пользователя. Если пользователь в данный момент не вошел в систему, auser вернет экземплярAnonymousUser. Это похоже на атрибутuser, но работает в асинхронном контексте.
- HttpRequest.get_host()¶
Возвращает оригинальное имя хоста используя информацию из
HTTP_X_FORWARDED_HOST(если включена настройкаUSE_X_FORWARDED_HOST) иHTTP_HOSTзаголовков, в соответствующем порядке. Если эти значения не определенны, метод использует комбинациюSERVER_NAMEиSERVER_PORTкак описано в PEP 3333.Например:
"127.0.0.1:8000"Вызывает
django.core.Exceptions.DisallowedHost, если хост не находится вALLOWED_HOSTSили имя домена недействительно в соответствии с RFC 1034/1035.Примечание
Метод
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)¶
Возвращает True, если заголовок запроса Accept соответствует аргументу mime_type:
>>> request.accepts("text/html") True
Большинство браузеров по умолчанию отправляют
Accept: */*, поэтому для всех типов контента будет возвращеноTrue. Установка явного заголовка Accept в запросах API может быть полезна для возврата другого типа контента только для этих потребителей. См. пример использования «accepts()» для возврата различного контента потребителям API.Если ответ варьируется в зависимости от содержимого заголовка Accept, и вы используете какую-либо форму кэширования, такую как Django
cache middleware, вам следует украсить представлениеvary_on_headers('Accept'), чтобы ответы правильно кэшировались.
- 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)¶
Создает новый QueryDict с ключами из iterable и каждым значением, равным value. Например:
>>> 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)¶
Принимает либо 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()¶
Возвращает копию объекта, используя
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()¶
Аналогично
items(), за исключением того, что он включает в виде списка все значения для каждого члена словаря. Например:>>> q = QueryDict("a=1&a=2&a=3") >>> q.lists() [('a', ['1', '2', '3'])]
- QueryDict.pop(key)¶
Возвращает список значений для данного ключа и удаляет их из словаря. Вызывает
KeyError, если ключ не существует. Например:>>> q = QueryDict("a=1&a=2&a=3", mutable=True) >>> q.pop("a") ['1', '2', '3']
- QueryDict.popitem()¶
Удаляет произвольный член словаря (поскольку не существует понятия упорядочения) и возвращает кортеж из двух значений, содержащий ключ и список всех значений ключа. Вызывает KeyError при вызове пустого словаря. Например:
>>> q = QueryDict("a=1&a=2&a=3", mutable=True) >>> q.popitem() ('a', ['1', '2', '3'])
- QueryDict.dict()¶
Возвращает представление
dictдляQueryDict. Для каждой пары (ключ, список) вQueryDict,dictбудет содержать (ключ, элемент), где item — один элемент списка, используя ту же логику, что иQueryDict.__getitem__():>>> q = QueryDict("a=1&a=3&a=5") >>> q.dict() {'a': '5'}
- QueryDict.urlencode(safe=None)¶
Возвращает строку данных в формате строки запроса. Например:
>>> 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¶
В отличии от объекта HttpRequest, который создается Django, объект HttpResponse создаете вы. Каждое представление должно создать и вернуть объект HttpResponse.
Класс HttpResponse находится в модуле django.http.
Использование¶
Передача строки¶
Типичное использование — передача содержимого страницы в виде строки, байтовой строки или memoryview в конструктор HttpResponse:
>>> from django.http import HttpResponse
>>> response = HttpResponse("Here's the text of the web page.")
>>> response = HttpResponse("Text only, please.", content_type="text/plain")
>>> response = HttpResponse(b"Bytestrings are also accepted.")
>>> response = HttpResponse(memoryview(b"Memoryview as well."))
Но если вы хотите добавлять контент постепенно, вы можете использовать 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.
Установка заголовков¶
Чтобы установить или удалить поле заголовка в вашем ответе, используйте HttpResponse.headers:
>>> response = HttpResponse()
>>> response.headers["Age"] = 120
>>> del response.headers["Age"]
Вы также можете манипулировать заголовками, рассматривая свой ответ как словарь:
>>> response = HttpResponse()
>>> response["Age"] = 120
>>> del response["Age"]
Это прокси для HttpResponse.headers и является исходным интерфейсом, предлагаемым HttpResponse.
При использовании этого интерфейса, в отличие от словаря, del не вызывает KeyError, если поле заголовка не существует.
Вы также можете установить заголовки при создании экземпляра:
>>> response = HttpResponse(headers={"Age": 120})
Для установки заголовков Cache-Control и Vary, лучше использовать функции patch_cache_control() и patch_vary_headers() из модуля django.utils.cache, так как эти поля могут содержать несколько значений, разделенных запятыми. Эти функции добавят новые значение не удаляя существующие.
HTTP заголовки не могут содержать перенос строки. При попытке добавить заголовок содержащий символ переноса строки (CR или LF) будет вызвано исключение BadHeaderError
Указываем браузеру воспринимать ответ как вложенный файл¶
Чтобы указать браузеру обрабатывать ответ как вложенный файл, установите заголовки Content-Type и Content-Disposition. Например, вот как вы можете вернуть электронную таблицу Microsoft Excel:
>>> response = HttpResponse(
... my_data,
... headers={
... "Content-Type": "application/vnd.ms-excel",
... "Content-Disposition": 'attachment; filename="foo.xls"',
... },
... )
Заголовок Content-Disposition никак не относится к Django, но очень легко забыть синтаксис, поэтому мы добавили пример.
Атрибуты¶
- HttpResponse.content¶
Байтовое представление содержимого, закодированное с объекта Unicode при необходимости.
- HttpResponse.cookies¶
Объект
http.cookies.SimpleCookie, содержащий файлы cookie, включенные в ответ.
- HttpResponse.headers¶
Нечувствительный к регистру объект, подобный dict, который предоставляет интерфейс для всех HTTP-заголовков ответа, за исключением заголовка Set-Cookie. См. Установка заголовков и
HttpResponse.cookies.
- HttpResponse.charset¶
Кодировка, в которую будет закодирован ответ. Если не указана во время создания объекта
HttpResponse, будет проверятсяcontent_type, и если не будет найдена, будет использоваться значение настройкиDEFAULT_CHARSET.
- HttpResponse.status_code¶
Код состояния HTTP для ответа.
Если
reason_phraseне установлен явно, изменениеstatus_codeвне конструктора также изменитreason_phrase.
- HttpResponse.reason_phrase¶
Фраза причины ответа HTTP. Он использует фразы причины по умолчанию <9110#section-15.1>стандарта HTTP.
Если не указан явно,
reason_phraseопределяется из текущего значенияstatus_code.
- HttpResponse.streaming¶
Всегда
False.Указывает middleware, что этот ответ потоковый и его нужно обрабатывать не так, как обычные запросы.
- HttpResponse.closed¶
True, если ответ был закрыт.
Методы¶
- HttpResponse.__init__(content=b'', content_type=None, status=200, reason=None, charset=None, headers=None)¶
Создает экземпляр объекта HttpResponse с заданным содержимым страницы, типом содержимого и заголовками.
contentчаще всего представляет собой итератор, байтовую строку,memoryviewили строку. Другие типы будут преобразованы в байтовую строку путем кодирования их строкового представления. Итераторы должны возвращать строки или байтовые строки, и они будут объединены вместе, чтобы сформировать содержимое ответа.content_type— это тип MIME, дополнительно дополненный кодировкой набора символов, и используется для заполнения HTTP-заголовкаContent-Type. Если не указано, он формируется из'text/html'и настроекDEFAULT_CHARSET, по умолчанию:"text/html; charset=utf-8".status— это код состояния HTTP для ответа. Вы можете использоватьhttp.HTTPStatusPython для значимых псевдонимов, таких какHTTPStatus.NO_CONTENT.reason– это описание HTTP ответа. Если не указано, будет использоваться стандартное значение.charset- кодировка, в которую будет закодирован ответ. Если не указана во время создания объектаHttpResponse, будет проверятсяcontent_type, и если не будет найдена, будет использоваться значение настройкиDEFAULT_CHARSET.headers— этоdictHTTP-заголовков для ответа.
- 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_ageдолжен быть объектомtimedelta, целым числом секунд или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 будут доступны только для текущего домена.Используйте
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 отправляется со всеми односайтовыми и межсайтовыми запросами.
Предупреждение
Спецификации 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().
- HttpResponse.delete_cookie(key, path='/', domain=None, samesite=None)¶
Удаляет cookie. Не вызывает исключения, если cookie не существует.
Учитывая механизм работы cookie, значения
pathиdomainдолжны быть такими же, какие использовались при вызовеset_cookie()– в противном случае cookie могут быть не удалены.
- 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()при генерации ответа.
Использование¶
Типичное использование может выглядеть так:
>>> 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.
Обратите внимание, что API, основанный на объектах dict, более расширяем, гибок и упрощает поддержание прямой совместимости. Поэтому вам следует избегать использования объектов, не диктуемых в ответе в формате JSON.
Предупреждение
До 5-го издания ECMAScript можно было отравить конструктор JavaScript Array. По этой причине Django по умолчанию не позволяет передавать объекты, не являющиеся диктуемыми, в конструктор JsonResponse. Однако большинство современных браузеров реализуют ECMAScript 5, который устраняет этот вектор атаки. Поэтому можно отключить эту меру безопасности.
Переопределяем преобразователь в JSON¶
Если вам нужно использовать другой класс кодировщика JSON, вы можете передать параметр encoder методу конструктора:
>>> response = JsonResponse(data, encoder=MyJSONEncoder)
Объекты StreamingHttpResponse¶
- class StreamingHttpResponse¶
Класс StreamingHttpResponse используется для потоковой передачи ответа от Django в браузер.
Расширенное использование
StreamingHttpResponse является несколько продвинутым, поскольку важно знать, будете ли вы обслуживать свое приложение синхронно под WSGI или асинхронно под ASGI, и соответствующим образом настроить свое использование.
Пожалуйста, внимательно прочитайте эти примечания.
Пример использования StreamingHttpResponse в WSGI — потоковая передача контента, когда генерация ответа занимает слишком много времени или использует слишком много памяти. Например, это полезно для генерации больших файлов CSV.
Однако при этом есть соображения по поводу производительности. Django под управлением WSGI предназначен для кратковременных запросов. Потоковая передача ответов привяжет рабочий процесс на весь период ответа. Это может привести к ухудшению производительности.
Вообще говоря, вам придется выполнять дорогостоящие задачи вне цикла запрос-ответ, вместо того чтобы прибегать к потоковому ответу.
Однако при обслуживании под ASGI StreamingHttpResponse не должен останавливать обработку других запросов во время ожидания ввода-вывода. Это открывает возможность долгоживущих запросов на потоковую передачу контента и реализации таких шаблонов, как длительный опрос и события, отправляемые сервером.
Даже согласно примечанию ASGI, StreamingHttpResponse следует использовать только в ситуациях, когда абсолютно необходимо, чтобы весь контент не повторялся перед передачей данных клиенту. Поскольку доступ к содержимому невозможен, многие промежуточные программы не могут нормально функционировать. Например, заголовки ETag и Content-Length не могут быть созданы для потоковой передачи ответов.
StreamingHttpResponse не является подклассом HttpResponse и предоставляет немного другое API. Однако, они очень похожи со следующими отличиями:
Ему должен быть присвоен итератор, который выдает в качестве содержимого байтовые строки,
memoryviewили строки. При обслуживании под управлением WSGI это должен быть итератор синхронизации. При обслуживании в ASGI это должен быть асинхронный итератор.Вы не можете получить доступ к его содержимому, кроме как путем итерации самого объекта ответа. Это должно происходить только тогда, когда ответ возвращается клиенту: вам не следует повторять ответ самостоятельно.
В WSGI ответ будет повторяться синхронно. В ASGI ответ будет повторяться асинхронно. (Вот почему тип итератора должен соответствовать используемому вами протоколу.)
Чтобы избежать сбоя, неправильный тип итератора будет сопоставлен с правильным типом во время итерации, и будет выдано предупреждение, но для этого итератор должен быть полностью использован, что вообще противоречит цели использования
StreamingHttpResponse.У него нет атрибута
content. Вместо этого у него есть атрибутstreaming_content. Это можно использовать в промежуточном программном обеспечении для переноса итерируемого ответа, но не следует использовать.Вы не можете использовать методы объекта файла
tell()илиwrite(). Это вызовет исключение.
Базовый класс HttpResponseBase является общим для HttpResponse и StreamingHttpResponse.
Атрибуты¶
- StreamingHttpResponse.streaming_content¶
Итератор содержимого ответа, байтовая строка, закодированная в соответствии с
HttpResponse.charset.
- StreamingHttpResponse.status_code¶
Код состояния HTTP для ответа.
Если
reason_phraseне установлен явно, изменениеstatus_codeвне конструктора также изменитreason_phrase.
- StreamingHttpResponse.reason_phrase¶
Фраза причины ответа HTTP. Он использует фразы причины по умолчанию <9110#section-15.1>стандарта HTTP.
Если не указан явно,
reason_phraseопределяется из текущего значенияstatus_code.
- StreamingHttpResponse.streaming¶
Всегда
True.
- StreamingHttpResponse.is_async¶
Логическое значение, указывающее, является ли
StreamingHttpResponse.streaming_contentасинхронным итератором или нет.Это полезно для промежуточного программного обеспечения, которому необходимо обернуть
StreamingHttpResponse.streaming_content.
Обработка отключений¶
Если клиент отключится во время потокового ответа, Django отменит сопрограмму, обрабатывающую ответ. Если вы хотите очистить ресурсы вручную, вы можете сделать это, перехватив asyncio.CancelledError:
async def streaming_response():
try:
# Do some work here
async for chunk in my_streaming_iterator():
yield chunk
except asyncio.CancelledError:
# Handle disconnect
...
raise
async def my_streaming_view(request):
return StreamingHttpResponse(streaming_response())
В этом примере показано, как обрабатывать отключение клиента во время потоковой передачи ответа. Если вы выполняете длительные операции в своем представлении перед возвратом объекта StreamingHttpResponse, то вы также можете захотеть обрабатывать отключения в самом представлении <async-handling-disconnect>`.
Объекты 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.Заголовок Content-Length устанавливается автоматически, если его можно угадать по содержимому open_file.
Заголовок Content-Type устанавливается автоматически, если его можно угадать по имени файла или имени open_file.
FileResponse принимает любой файлоподобный объект с двоичным содержимым, например файл, открытый в двоичном режиме, например:
>>> from django.http import FileResponse
>>> response = FileResponse(open("myfile.png", "rb"))
Файл закроется автоматически, поэтому не открывайте его с помощью контекстного менеджера.
Использовать под ASGI
Файловый API Python является синхронным. Это означает, что файл должен быть полностью использован, чтобы его можно было обслуживать в рамках ASGI.
Для асинхронной потоковой передачи файла вам необходимо использовать сторонний пакет, предоставляющий асинхронный файловый API, например aiofiles.
Методы¶
- FileResponse.set_headers(open_file)¶
Этот метод автоматически вызывается во время инициализации ответа и устанавливает различные заголовки («Content-Length», «Content-Type» и «Content-Disposition») в зависимости от «open_file».
Класс HttpResponseBase¶
- class HttpResponseBase¶
Класс HttpResponseBase является общим для всех ответов Django. Его не следует использовать для непосредственного создания ответов, но он может быть полезен для проверки типов.