Объекты запроса и ответа ¶
Быстрый просмотр ¶
Django использует объекты запроса и ответа для передачи статуса через систему.
Когда страница запрашивается, Django создает объект, HttpRequest
содержащий метаданные о запросе. Затем Django загружает соответствующее представление, передавая ему объект HttpRequest
в качестве первого параметра. Каждое представление отвечает за возврат объекта HttpResponse
.
Этот документ представляет API объектов HttpRequest
и HttpResponse
, которые определены в модуле django.http
.
Объекты HttpRequest
¶
-
класс
HttpRequest
¶
Атрибуты ¶
Все атрибуты должны считаться доступными только для чтения, если не указано иное.
-
HttpRequest.
scheme
¶ Строка, представляющая протокол запроса (обычно
http
илиhttps
).
-
HttpRequest.
body
¶ Необработанное тело HTTP-запроса в виде двоичной строки. Этот атрибут полезен для обработки данных другим способом, чем обычная обработка форм HTML: двоичные изображения, содержимое XML и т. Д. Для данных обычной формы используйте
HttpRequest.POST
.Вы также можете прочитать содержимое объекта,
HttpRequest
используя интерфейс типа файла с помощьюHttpRequest.read()
илиHttpRequest.readline()
. Доступ к атрибутуbody
после чтения содержимого запроса с помощью одного из этих методов потока ввода-вывода приведет к созданию файлаRawPostDataException
.
-
HttpRequest.
path
¶ Строка, представляющая полный путь к запрошенной странице без протокола или домена.
Пример:
"/musique/groupes/les_beatles/"
-
HttpRequest.
path_info
¶ В некоторых конфигурациях веб-сервера часть URL-адреса после имени хоста делится на часть «префикс сценария» и часть «информация о пути». Атрибут
path_info
всегда содержит часть пути с информацией о пути, независимо от используемого веб-сервера. Лучше использовать этот атрибутpath
, поскольку он улучшает переносимость кода между тестовым сервером и сервером развертывания.Например, если для параметра
WSGIScriptAlias
вашего приложения установлено значение"/minfo"
, тоpath
может быть"/minfo/musique/groupes/les_beatles/"
иpath_info
будет"/musique/groupes/les_beatles/"
.
-
HttpRequest.
method
¶ Строка, соответствующая методу HTTP, используемому в запросе. Всегда в столицах. Например :
if request.method == 'GET': do_something() elif request.method == 'POST': do_something_else()
-
HttpRequest.
encoding
¶ Строка, представляющая текущую кодировку, используемую для декодирования представленных данных формы (или
None
, что означает, что это параметр,DEFAULT_CHARSET
который используется). Вы можете переопределить этот атрибут, чтобы изменить кодировку, используемую при доступе к данным формы. Любое новое чтение атрибута (например, доступGET
илиPOST
) будет использовать новое значениеencoding
. Это полезно, когда вы знаете, что данные формы не в кодировкеDEFAULT_CHARSET
.
-
HttpRequest.
content_type
¶ Строка, представляющая MIME-тип запроса, взятый из заголовка
CONTENT_TYPE
.
-
HttpRequest.
content_params
¶ Словарь параметров "ключ-значение", включенных в заголовок
CONTENT_TYPE
.
-
HttpRequest.
GET
¶ Объект типа словаря, содержащий все заданные параметры HTTP GET. См. Документацию
QueryDict
ниже.
-
HttpRequest.
POST
¶ Объект типа словаря, содержащий все заданные параметры HTTP POST, если запрос содержит данные формы. См. Документацию
QueryDict
ниже. Если вам нужно получить доступ к необработанным или несвязанным данным формы из запроса, используйте вместо этого доступ по атрибутамHttpRequest.body
.Возможно, что запрос поступает через POST с
POST
пустым словарем , например, когда форма отправляется методом HTTP POST, но не содержит данных формы. Вот почему его следует использовать не для того, чтобы узнать, использовался ли метод POST, а лучше (см. ).if request.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
соответствует ключуMETA
HTTP_X_BENDER
.Обратите внимание, что
runserver
игнорируются любые заголовки, содержащие в своем имени символы подчеркивания, поэтому они не отображаются вMETA
. Это предотвращает подделку заголовков из-за двусмысленности между подчеркиваниями и дефисами, которые нормализованы до подчеркивания в переменных среды WSGI. Это соответствует поведению веб-серверов, таких как Nginx и Apache 2.4+.HttpRequest.headers
- это более простой способ получить доступ ко всем заголовкам с префиксом HTTP, а такжеCONTENT_LENGTH
иCONTENT_TYPE
.
-
HttpRequest.
headers
¶ Подобный словарю объект без учета регистра, который обеспечивает доступ ко всем заголовкам запросов с префиксом 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 }}
Изменено в Django 3.0:Добавлена поддержка доступа с подчеркиванием синтаксиса.
-
HttpRequest.
resolver_match
¶ Экземпляр
ResolverMatch
представления разрешенного URL-адреса. Этот атрибут устанавливается только после фазы разрешения URL-адреса, что означает, что он доступен во всех представлениях, но не в промежуточном программном обеспечении, которое запускается до фазы разрешения URL-адреса ( однако атрибут доступен вprocess_view()
).
Атрибуты, определяемые кодом приложения ¶
Django сам не определяет эти атрибуты, но использует их, если они определены приложением.
-
HttpRequest.
current_app
¶ Тег шаблона
url
использует его значение в качестве параметраcurrent_app
изreverse()
.
-
HttpRequest.
urlconf
¶ Он будет использоваться в качестве конфигурации корневого URL для текущего запроса, переопределяя значение
ROOT_URLCONF
. Подробнее см . Процесс обработки запросов Django .urlconf
можно установить, чтобыNone
отменить любые изменения, сделанные предыдущим промежуточным программным обеспечением, и вернуться кROOT_URLCONF
начальному значению .
-
HttpRequest.
exception_reporter_filter
¶ Это будет использоваться вместо
DEFAULT_EXCEPTION_REPORTER_FILTER
текущего запроса. См. Подробные сведения о пользовательских отчетах об ошибках.
-
HttpRequest.
exception_reporter_class
¶ Это будет использоваться вместо
DEFAULT_EXCEPTION_REPORTER
текущего запроса. См. Подробные сведения о пользовательских отчетах об ошибках.
Атрибуты, определенные в промежуточном программном обеспечении ¶
Некоторое промежуточное ПО, включенное в приложения, предоставленные 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
() ¶ Возвращает исходный хост запроса на основе заголовков
HTTP_X_FORWARDED_HOST
(еслиUSE_X_FORWARDED_HOST
он включен) иHTTP_HOST
в указанном порядке. Если они не содержат искомого значения, метод использует комбинациюSERVER_NAME
иSERVER_PORT
, как объяснено вPEP 3333 .Пример:
"127.0.0.1:8000"
Заметка
Метод
get_host()
не работает, если хост находится за более чем одним прокси-сервером. Одно из решений - использовать промежуточное ПО для перезаписи заголовков прокси-серверов, как в следующем примере:class MultipleProxyMiddleware: 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
() ¶ Возвращает исходный порт запроса на основе информации о переменной
META
HTTP_X_FORWARDED_PORT
(если онаUSE_X_FORWARDED_PORT
включена) иSERVER_PORT
в указанном порядке.
-
HttpRequest.
get_full_path
() ¶ Возвращает путь
path
, включая параметры запроса, если они есть.Пример:
"/musique/groupes/les_beatles/?print=true"
-
HttpRequest.
get_full_path_info
() ¶ Вроде
get_full_path()
, но используйтеpath_info
вместоpath
.Пример:
"/minfo/music/bands/the_beatles/?print=true"
-
HttpRequest.
build_absolute_uri
( location = None ) ¶ Возвращает абсолютную форму 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
() ¶ Возвращает
True
, является ли запрос безопасным, то есть он был сделан по HTTPS.
-
HttpRequest.
accepts
( mime_type ) ¶ - Новое в Django 3.1.
Возвращает,
True
еслиAccept
заголовок запроса соответствуетmime_type
аргументу:>>> request.accepts('text/html') True
Большинство браузеров отправляют по умолчанию, поэтому это будет возвращаться для всех типов контента. Установка явного заголовка в запросах API может быть полезна для возврата другого типа контента только для этих потребителей. См. Пример использования согласования содержимого для возврата различного содержимого потребителям API.
Accept: */*
True
Accept
accepts()
Если ответ зависит от содержимого
Accept
заголовка и вы используете какую-либо форму кеширования, например, в Django , вам следует украсить представление, чтобы ответы правильно кэшировались.cache middleware
vary_on_headers('Accept')
-
HttpRequest.
is_ajax
() ¶ Не рекомендуется, начиная с версии 3.1.
Возвращает, был
True
ли запрос сделан кем-либоXMLHttpRequest
, в зависимости от наличия строки'XMLHttpRequest'
в заголовкеHTTP_X_REQUESTED_WITH
. Большинство современных библиотек JavaScript отправляют этот заголовок. Если вы пишете свой собственный вызовXMLHttpRequest
(на стороне браузера), вам нужно будет вручную установить этот заголовок, если вы хотите, чтобы онis_ajax()
работал.Если ответ меняется в зависимости от того, является ли он запросом AJAX или нет, и вы используете какую-то форму кеширования, такую как « l» в Django, вам следует украсить представление им, чтобы ответы кэшировались соответствующим образом.
intergiciel de cache
vary_on_headers('X-Requested-With')
-
HttpRequest.
read
( размер = Нет ) ¶
-
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
¶
-
класс
QueryDict
¶
В объекте 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 ) ¶ Создает экземпляр объекта
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__()
.Строки, используемые для определения ключей и значений, преобразуются в строки
str
с использованием кодирования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__
( ключ ) ¶ Возвращает значение указанного ключа. Если ключ имеет более одного значения, он возвращает последнее значение. Сгенерировать,
django.utils.datastructures.MultiValueDictKeyError
если ключ не существует (это исключение наследуется от стандартного исключения PythonKeyError
, вы все равно можете его пойматьKeyError
).
-
QueryDict.
__setitem__
( ключ , значение ) ¶ Устанавливает для данного ключа значение
[value]
(список, единственным элементом которого являетсяvalue
). Обратите внимание, что, как и другие словарные функции, которые имеют побочные эффекты, этот метод можно вызывать только дляQueryDict
редактируемого объекта (например, для экземпляра, созданного с помощьюQueryDict.copy()
).
-
QueryDict.
__contains__
( ключ ) ¶ Возвращает,
True
если заданный ключ установлен. Это позволяет, например, писать .if "foo" in request.GET
-
QueryDict.
get
( ключ , по умолчанию = Нет ) ¶ Использует ту же логику, что
__getitem__()
и с точкой входа, чтобы вернуть значение по умолчанию, если ключ не существует.
-
QueryDict.
setdefault
( ключ , по умолчанию = Нет ) ¶ Вроде
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
() ¶ Вернуть копию объекта с помощью
copy.deepcopy()
. Копию можно редактировать, даже если исходный объект - нет.
-
QueryDict.
getlist
( ключ , по умолчанию = Нет ) ¶ Возвращает список данных, соответствующих запрошенному ключу. Возвращает пустой список, если ключ не существует и не указано значение по умолчанию. Во всех случаях он возвращает список, если только значение по умолчанию не является списком.
-
QueryDict.
setlist
( ключ , список_ ) ¶ Устанавливает для указанного ключа значение
list_
(в отличие от__setitem__()
).
-
QueryDict.
appendlist
( ключ , элемент ) ¶ Добавляет элемент во внутренний список, связанный с ключом.
-
QueryDict.
setlistdefault
( ключ , default_list = Нет ) ¶ То же, что и
setdefault()
, за исключением того, что принимает список значений вместо одного значения.
-
QueryDict.
lists
() ¶ Подобно
items()
, за исключением того, что он включает все значения в виде списка для каждого элемента в словаре. Например :>>> q = QueryDict('a=1&a=2&a=3') >>> q.lists() [('a', ['1', '2', '3'])]
-
QueryDict.
pop
( ключ ) ¶ Возвращает список значений, соответствующих данному ключу, и удаляет их из словаря. Сгенерировать,
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
ключ / элемент пары или элемент будет элемент списка, следуя той же логикеQueryDict.__getitem__()
:>>> q = QueryDict('a=1&a=3&a=5') >>> q.dict() {'a': '5'}
-
QueryDict.
urlencode
( сейф = Нет ) ¶ Возвращает текстовое представление данных в формате «строки запроса». Например :
>>> 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
¶
-
класс
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.'))
Поддержка memoryview
была добавлена.
Но если вы хотите добавлять контент постепенно, вы можете использовать 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()
from 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"'
В заголовке нет ничего специфического для Django Content-Disposition
, но этот синтаксис быстро забывается, поэтому мы включили его сюда.
Атрибуты ¶
-
HttpResponse.
content
¶ Строка октетов, представляющая содержимое, при необходимости закодированное из строки.
-
HttpResponse.
charset
¶ Строка, указывающая набор символов, в котором будет закодирован ответ. Если этот параметр не указан при создании экземпляра
HttpResponse
, он будет извлечен изcontent_type
, а в случае неудачиDEFAULT_CHARSET
будет использован параметр.
-
HttpResponse.
status_code
¶ Код состояния HTTP ответа.
Пока это
reason_phrase
не определено явно, изменение значения заstatus_code
пределами конструктора также изменяет значениеreason_phrase
.
-
HttpResponse.
reason_phrase
¶ Фраза причины HTTP для ответа. Он использует фразы причины по умолчанию изСтандарт HTTP .
Пока это
reason_phrase
не определено явным образом, оно определяется значениемstatus_code
.
-
HttpResponse.
streaming
¶ Этот атрибут есть всегда
False
.Этот атрибут существует для того, чтобы промежуточное ПО могло обрабатывать потоковые ответы иначе, чем обычные ответы.
-
HttpResponse.
closed
¶ True
если ответ был закрыт.
Методы ¶
-
HttpResponse.
__init__
( content = b '' , content_type = None , status = 200 , cause = None , charset = None ) ¶ Создает экземпляр объекта
HttpResponse
с заданным содержимым страницы и типом содержимого.content
и чаще всего итератор, строка байтов, объектmemoryview
или строка. Остальные типы преобразуются в строку октетов путем кодирования их текстового представления. Итераторы должны возвращать строки или байтовые строки, и они будут объединены для формирования содержимого ответа.content_type
- это тип MIME, который может быть дополнительно дополнен кодировкой набора символов и используется для заполнения заголовка HTTPContent-Type
. Когда он не указан, этот параметр формируется'text/html'
иDEFAULT_CHARSET
по умолчанию ."text/html; charset=utf-8"
status
это Код состояния HTTP ответа. Вы можете использовать классhttp.HTTPStatus
Python для присвоения значимых псевдонимов, напримерHTTPStatus.NO_CONTENT
.reason
это фраза ответа HTTP. Если не указано иное, используется фраза по умолчанию.charset
- набор символов, в котором будет закодирован ответ. Если он не указан, он будет извлеченcontent_type
, а если он не будет успешным,DEFAULT_CHARSET
будет использован параметр.Изменено в Django 3.0:Добавлена поддержка
content
asmemoryview
.
-
HttpResponse.
__setitem__
( заголовок , значение ) ¶ Устанавливает заданное имя заголовка в заданное значение.
header
иvalue
оба должны быть строками.
-
HttpResponse.
__delitem__
( заголовок ) ¶ Удаляет названный заголовок. Тихо не работает, если заголовок не существует. Нечувствителен к поломкам.
-
HttpResponse.
__getitem__
( заголовок ) ¶ Возвращает значение, соответствующее названному имени заголовка. Нечувствителен к поломкам.
-
HttpResponse.
has_header
( заголовок ) ¶ Возвращает
True
или наFalse
основе поиска без учета регистра для заголовка с указанным именем.
-
HttpResponse.
setdefault
( заголовок , значение ) ¶ Определяет заголовок, если его еще нет.
Устанавливает cookie. Параметры такие же, как у
Morsel
стандартного объекта библиотеки Python.max_age
должно быть числом секунд илиNone
(по умолчанию), если файл cookie должен существовать только в течение сеанса браузера клиента. Еслиexpires
не предусмотрено, рассчитывается.expires
должен быть либо строкой в формате, либо объектом в формате UTC. Если является объектом , вычисляется значение."Wdy, DD-Mon-YY HH:MM:SS GMT"
datetime.datetime
expires
datetime
max_age
Используйте,
domain
если хотите установить междоменный файл cookie. Например,domain="example.com"
устанавливает файл cookie, доступный для чтения доменами www.example.com, blog.example.com и т. Д. В противном случае cookie доступен только для домена, который его определил.Укажите
secure=True
, хотите ли вы, чтобы cookie отправлялся на сервер только тогда, когда запрос выполняется через соединениеhttps
.Используйте,
httponly=True
если вы хотите, чтобы клиентский код JavaScript не мог получить доступ к cookie.HttpOnly - это флаг, включенный в заголовок ответа HTTP Set-Cookie. Это часть стандартаRFC 6265 для файлов cookie, и это полезный способ снизить риск доступа сценария на стороне клиента к данным из защищенного файла cookie.
Используйте
samesite='Strict'
или,samesite='Lax'
чтобы указать браузеру не отправлять этот файл cookie при запросе другого источника. SameSite поддерживается не всеми браузерами, поэтому это не замена защиты Django от CSRF, а скорее защитная мера консолидации.Используйте
samesite='None'
(строка), чтобы явно указать, что этот файл cookie отправляется со всеми запросами на одном сайте и между сайтами.
Изменено в Django 3.1:Использование
samesite='None'
(строка) разрешено.Предупреждение
RFC 6265 указывает, что пользовательские агенты должны поддерживать файлы cookie размером не менее 4096 байт. Для многих браузеров это также максимальный размер. Django не генерирует исключение при создании файла cookie размером более 4096 байт, но многие браузеры не сохраняют файл cookie должным образом.
Вроде
set_cookie()
, но cookie перед установкой зашифровывается . Для использования в сочетании сHttpRequest.get_signed_cookie()
. Вы можете использовать необязательный параметрsalt
для усиления ключа, но тогда не забудьте передать его и вHttpRequest.get_signed_cookie()
соответствующий вызов .Изменено в Django 3.1:Использование
samesite='None'
(строка) разрешено.
Удаляет cookie, соответствующий названному ключу. Тихо не работает, если ключ не существует.
Из - за того , как печенье работать,
path
иdomain
должны содержать одни и те же значения , которые были использованы дляset_cookie()
- в противном случае, куки не могут быть удалены.Изменено в Django 2.2.15:Параметр
samesite
добавлен.
-
HttpResponse.
close
() ¶ Этот метод вызывается в конце запроса непосредственно сервером WSGI.
-
HttpResponse.
write
( содержание ) ¶ Этот метод преобразует экземпляр
HttpResponse
в объект типа файла.
-
HttpResponse.
flush
() ¶ Этот метод преобразует экземпляр
HttpResponse
в объект типа файла.
-
HttpResponse.
tell
() ¶ Этот метод преобразует экземпляр
HttpResponse
в объект типа файла.
-
HttpResponse.
getvalue
() ¶ Возвращает значение
HttpResponse.content
. Этот метод преобразует экземплярHttpResponse
в объект типа потока.
-
HttpResponse.
readable
() ¶ Всегда
False
. Этот метод преобразует экземплярHttpResponse
в объект типа потока.
-
HttpResponse.
seekable
() ¶ Всегда
False
. Этот метод преобразует экземплярHttpResponse
в объект типа потока.
-
HttpResponse.
writable
() ¶ Всегда
True
. Этот метод преобразует экземплярHttpResponse
в объект типа потока.
-
HttpResponse.
writelines
( линии ) ¶ Записывает список строк в ответе. Разделители строк не добавляются. Этот метод преобразует экземпляр
HttpResponse
в объект типа потока.
Подклассы HttpResponse
¶
Django включает ряд подклассов для HttpResponse
обработки различных типов HTTP-ответов. Мол HttpResponse
, эти подклассы находятся в django.http
.
-
класс
HttpResponseRedirect
¶ Обязательным является первый параметр конструктора, путь, по которому должно быть выполнено перенаправление. Это может быть полный URL-адрес (например
'https://www.yahoo.com/search/'
), абсолютный путь без домена (например'/search/'
) или даже относительный путь (например'search/'
). В последнем случае браузер клиента восстановит сам полный URL-адрес на основе текущего пути. См.HttpResponse
Другие необязательные параметры конструктора. Обратите внимание, что этот класс возвращает код состояния HTTP 302.-
url
¶ Этот доступный только для чтения атрибут представляет URL-адрес, на который будет перенаправлен ответ (эквивалент заголовка ответа
Location
).
-
-
класс
HttpResponsePermanentRedirect
¶ Подобно
HttpResponseRedirect
, но возвращает постоянное перенаправление (код статуса HTTP 301) вместо «найденного» перенаправления (код статуса 302).
-
класс
HttpResponseNotModified
¶ Конструктор не принимает никаких параметров, и этот ответ не принимает никакого содержимого. Этот класс используется, чтобы указать, что страница не была изменена с момента последнего запроса пользователя (код состояния 304).
-
класс
HttpResponseBadRequest
¶ Действует аналогично,
HttpResponse
но возвращает код состояния 400.
-
класс
HttpResponseNotFound
¶ Действует аналогично,
HttpResponse
но возвращает код состояния 404.
-
класс
HttpResponseForbidden
¶ Действует аналогично,
HttpResponse
но возвращает код состояния 403.
-
класс
HttpResponseNotAllowed
¶ Подобно,
HttpResponse
но возвращает код состояния 405. Первый параметр конструктора обязателен: список разрешенных методов (например ).['GET', 'POST']
-
класс
HttpResponseGone
¶ Действует аналогично,
HttpResponse
но возвращает код состояния 410.
-
класс
HttpResponseServerError
¶ Действует аналогично,
HttpResponse
но возвращает код состояния 500.
Заметка
Если пользовательский подкласс HttpResponse
реализует метод render
, Django предполагает, что он имитирует ответ SimpleTemplateResponse
, и сам метод render
должен возвращать действительный объект ответа.
Пользовательские классы ответов ¶
Если вам нужно использовать класс ответа, который 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
должен быть экземпляромdict
. Если для параметраsafe
установлено значениеFalse
(см. Ниже), это может быть любой объект, который может быть сериализован в JSON.Кодировщик,
encoder
который содержит по умолчаниюdjango.core.serializers.json.DjangoJSONEncoder
, используется для сериализации данных. Дополнительные сведения об этом сериализаторе см. В разделе « Сериализация JSON» .Логический параметр
safe
является поTrue
умолчанию. Если установленоFalse
, любой объект может быть сериализован (в противном случаеdict
разрешены только экземпляры ). Еслиsafe
равноTrue
и в качестве первого параметра передается объект, не являющийся словарем, генерируется исключениеTypeError
.Параметр
json_dumps_params
представляет собой словарь именованных параметров, передаваемых вызову,json.dumps()
используемому для генерации ответа.
Использование ¶
Вот как может выглядеть типичное использование:
>>> from django.http import JsonResponse
>>> response = JsonResponse({'foo': 'bar'})
>>> response.content
b'{"foo": "bar"}'
Сериализация не словарных объектов ¶
Чтобы иметь возможность сериализовать объекты, отличные от словарей, вы должны установить для параметра safe
значение False
:
>>> response = JsonResponse([1, 2, 3], safe=False)
В случае, если safe=False
он не передан, выдается исключение TypeError
.
Предупреждение
До 5-й редакции ECMAScript можно было повредить конструктор Array
JavaScript. По этой причине Django по умолчанию не позволяет передавать в конструктор объекты, не являющиеся словарными JsonResponse
. Однако большинство современных браузеров реализуют EcmaScript 5, который устраняет этот вектор атаки. Таким образом, эту меру безопасности можно отключить.
Изменение кодировщика JSON по умолчанию ¶
Если вам нужно использовать другой класс кодировки JSON, вы можете передать параметр encoder
в метод конструктора:
>>> response = JsonResponse(data, encoder=MyJSONEncoder)
Объекты StreamingHttpResponse
¶
-
класс
StreamingHttpResponse
¶
Класс StreamingHttpResponse
используется для потоковой передачи ответа от Django браузеру. Это можно использовать для создания ответа, который занимает много времени или использует много памяти. Например, это полезно для создания больших файлов CSV .
Соображения производительности
Django предназначен для обработки краткосрочных запросов. Потоковые ответы связывают рабочий процесс на время ответа. Это может привести к снижению производительности.
Как правило, тяжелые задачи следует выполнять вне цикла запрос-ответ, а не вызывать потоковый ответ.
Класс StreamingHttpResponse
не наследует от HttpResponse
, потому что его API немного отличается. Однако он практически идентичен, за исключением следующих заметных отличий:
- Ему должен быть предоставлен итератор, который производит байтовые строки в качестве содержимого.
- Единственный способ получить доступ к его содержимому - перебрать сам объект ответа. Это следует делать только при отправке ответа клиенту.
- У него нет атрибута
content
. Вместо этого у него есть атрибутstreaming_content
. - Вы не можете использовать тип файла
tell()
илиwrite()
. Если вы это сделаете, вы получите исключение.
StreamingHttpResponse
следует использовать только в ситуациях, которые действительно требуют итеративного доступа ко всему содержимому, чтобы происходить только при передаче данных клиенту. Поскольку контент недоступен напрямую, многие промежуточные программы не могут работать должным образом. Например, заголовки ETag
и Content-Length
не могут быть созданы для ответов In-Stream.
Атрибуты ¶
-
StreamingHttpResponse.
streaming_content
¶ Итератор содержимого ответа, закодированного как байтовая строка на основе
HttpResponse.charset
.
-
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 ) ¶ FileResponse
является подклассом,StreamingHttpResponse
оптимизированным для двоичных файлов. Оно используетwsgi.file_wrapper, если он предоставляется сервером wsgi, в противном случае он передает файл небольшими порциями.Если
as_attachment=True
заголовокContent-Disposition
установлен вattachment
, который побуждает браузер предложить файл для загрузки пользователя. В противном случае будет установлен заголовокContent-Disposition
со значениемinline
(по умолчанию для браузеров), если имя файла доступно.Если у
open_file
него нет имени или если имя неверно, укажите пользовательское имя файла с помощью параметраfilename
. Обратите внимание, что если вы передаете объект типа файла, напримерio.BytesIO
, вы должныseek()
при необходимости вызвать его перед передачей вFileResponse
.Заголовки
Content-Length
иContent-Type
устанавливаются автоматически, когда они могут быть выведены из содержимогоopen_file
.
FileResponse
принимает любой объект типа файла с двоичным содержимым, например файл, открытый в двоичном режиме, например:
>>> from django.http import FileResponse
>>> response = FileResponse(open('myfile.png', 'rb'))
Файл будет автоматически закрыт, поэтому не открывайте его с помощью диспетчера контекста.