Объекты запроса и ответа ¶
Краткий обзор ¶
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
¶ Строка, представляющая полный путь к запрошенной странице, не включая схему или домен.
Пример:
"/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
¶ Строка, представляющая MIME-тип запроса, извлеченная из
CONTENT_TYPE
заголовка.
-
HttpRequest.
content_params
¶ Словарь параметров "ключ-значение", включенных в
CONTENT_TYPE
заголовок.
-
HttpRequest.
GET
¶ Подобный словарю объект, содержащий все заданные параметры HTTP GET. См.
QueryDict
Документацию ниже.
-
HttpRequest.
POST
¶ Подобный словарю объект, содержащий все заданные параметры HTTP POST, при условии, что запрос содержит данные формы. См.
QueryDict
Документацию ниже. Если вам нужно получить доступ к необработанным данным или данным, не относящимся к форме, опубликованным в запросе, используйтеHttpRequest.body
вместо этого атрибут.Возможно, что запрос может поступить через POST с пустым
POST
словарем - если, скажем, форма запрашивается через метод POST HTTP, но не включает данные формы. Следовательно, вы не должны использовать для проверки использования метода 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
¶ Нечувствительный к регистру объект типа 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, что означает, что он доступен во всех представлениях, но не в промежуточном программном обеспечении, которое выполняется до того, как происходит разрешение URL (вы можете использовать его в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
текущего запроса. См. Подробные сведения в разделе Пользовательские отчеты об ошибках.
Атрибуты, установленные промежуточным программным обеспечением ¶
Некоторые из промежуточного программного обеспечения, включенного в приложения Contrib Django, устанавливают атрибуты по запросу. Если вы не видите атрибут в запросе, убедитесь, что соответствующий класс промежуточного программного обеспечения указан в MIDDLEWARE
.
-
HttpRequest.
session
¶ Из
SessionMiddleware
: Читаемый и доступный для записи, подобный словарю объект, представляющий текущий сеанс.
-
HttpRequest.
site
¶ От
CurrentSiteMiddleware
: ЭкземплярSite
илиRequestSite
как возвращенный,get_current_site()
представляя текущий сайт.
-
HttpRequest.
user
¶ От
AuthenticationMiddleware
: Экземпляр,AUTH_USER_MODEL
представляющий текущего вошедшего в систему пользователя. Если пользователь в настоящее время не вошел в систему,user
будет установлен экземплярAnonymousUser
. Вы можете отличить их друг от другаis_authenticated
следующим образом:if request.user.is_authenticated: ... # Do something for logged-in users. else: ... # Do something for anonymous users.
Методы ¶
-
HttpRequest.
get_host
() ¶ Возвращает исходный узел запроса, используя информацию из
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()
Метод терпит неудачу , когда хозяин находится позади нескольких прокси - серверов. Одним из решений является использование промежуточного программного обеспечения для перезаписи заголовков прокси, как в следующем примере: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
.Пример:
"/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
, путем проверкиHTTP_X_REQUESTED_WITH
заголовка строки'XMLHttpRequest'
. Большинство современных библиотек JavaScript отправляют этот заголовок. Если вы пишете свой собственныйXMLHttpRequest
вызов (на стороне браузера), вам придется установить этот заголовок вручную, если вы хотитеis_ajax()
работать.Если ответ зависит от того, запрошен он через AJAX или нет, и вы используете какую-либо форму кеширования, такую как Django , вам следует украсить представление, чтобы ответы были правильно кэшированы.
cache middleware
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
s at 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
s вы столкнулись, и в частности, наrequest.POST
иrequest.GET
, будет неизменен. Если вы создаете один экземпляр самостоятельно, вы можете сделать его изменяемым, передавmutable=True
его__init__()
.Строки для установки ключей и значений будут преобразованы из
encoding
вstr
. Еслиencoding
не установлен, по умолчанию используетсяDEFAULT_CHARSET
.
-
classmethod
QueryDict.
fromkeys
( iterable , value = '' , mutable = False , encoding = None ) ¶ Создает новый объект
QueryDict
с ключами fromiterable
и каждым значением, равным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
( ключ , по умолчанию = Нет ) ¶ Возвращает список данных с запрошенным ключом. Возвращает пустой список, если ключ не существует и
default
естьNone
. Гарантируется возврат списка, если указанное по умолчанию значение не является списком.
-
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.'))
Но если вы хотите добавлять контент постепенно, вы можете использовать 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
вместо этого использовать класс.
Настройка полей заголовка ¶
Чтобы установить или удалить поле заголовка в своем ответе, используйте
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
, так как эти поля могут иметь множественные значения , разделенные запятой. Методы «patch» гарантируют, что другие значения, например, добавленные промежуточным программным обеспечением, не будут удалены.
Поля заголовка HTTP не могут содержать символы новой строки. Попытка установить поле заголовка, содержащее символ новой строки (CR или LF), вызоветBadHeaderError
Добавлен HttpResponse.headers
интерфейс.
Добавлена возможность задавать заголовки при создании экземпляра.
Указание браузеру рассматривать ответ как вложение файла ¶
Чтобы сообщить браузеру , чтобы обработать ответ в виде вложенного файла, установите
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
¶ Строка байтов, представляющая содержимое, при необходимости закодированное из строки.
-
HttpResponse.
headers
¶ - Новое в Django 3.2.
Нечувствительный к регистру объект типа dict, который предоставляет интерфейс для всех заголовков HTTP в ответе. См. Настройка полей заголовка .
-
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 , headers = None ) ¶ Создает экземпляр
HttpResponse
объекта с заданным содержимым страницы, типом содержимого и заголовками.content
чаще всего является итератором, строкой байтовmemoryview
или строкой. Другие типы будут преобразованы в байтовую строку путем кодирования их строкового представления. Итераторы должны возвращать строки или байтовые строки, и они будут объединены вместе для формирования содержимого ответа.content_type
- это тип MIME, который может быть дополнен кодировкой набора символов и используется для заполненияContent-Type
заголовка HTTP . Если не указано, оно формируется'text/html'
иDEFAULT_CHARSET
настройки по умолчанию: ."text/html; charset=utf-8"
status
это Код состояния HTTP для ответа. Вы можете использовать Pythonhttp.HTTPStatus
для значимых псевдонимов, таких какHTTPStatus.NO_CONTENT
.reason
это фраза ответа HTTP. Если не указан, будет использоваться фраза по умолчанию.charset
- кодировка, в которой будет закодирован ответ. Если не задан, он будет извлеченcontent_type
, а если это неDEFAULT_CHARSET
удастся, будет использована настройка.headers
представляет собойdict
заголовок HTTP для ответа.Изменено в Django 3.2:headers
Параметр был добавлен.
-
HttpResponse.
__setitem__
( заголовок , значение ) ¶ Устанавливает для заданного имени заголовка заданное значение. Оба
header
иvalue
должны быть строками.
-
HttpResponse.
__delitem__
( заголовок ) ¶ Удаляет заголовок с заданным именем. Если заголовок не существует, происходит автоматическая ошибка. Без учета регистра.
-
HttpResponse.
__getitem__
( заголовок ) ¶ Возвращает значение для заданного имени заголовка. Без учета регистра.
-
HttpResponse.
get
( заголовок , альтернатива = Нет ) ¶ Возвращает значение для данного заголовка или,
alternate
если заголовок не существует.
-
HttpResponse.
has_header
( заголовок ) ¶ Возвращает
True
или наFalse
основе проверки без учета регистра для заголовка с заданным именем.
-
HttpResponse.
items
() ¶ Действует аналогично
dict.items()
заголовкам HTTP в ответе.
-
HttpResponse.
setdefault
( заголовок , значение ) ¶ Устанавливает заголовок, если он еще не установлен.
Устанавливает cookie. Параметры такие же, как у
Morsel
объекта cookie в стандартной библиотеке 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 поддерживается не всеми браузерами, поэтому это не замена защиты CSRF в Django, а, скорее, мера глубокой защиты.Используйте
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 будет рассматривать его как эмуляцию a
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
и в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
будет поднят.
Предупреждение
До 5-й редакции ECMAScript
можно было отравить Array
конструктор JavaScript . По этой причине Django JsonResponse
по умолчанию не позволяет передавать в конструктор объекты, отличные от dict
. Однако большинство современных браузеров реализуют EcmaScript 5, который устраняет этот вектор атаки. Поэтому можно отключить эту меру безопасности.
Изменение кодировщика JSON по умолчанию ¶
Если вам нужно использовать другой класс кодировщика JSON, вы можете передать encoder
параметр в метод конструктора:
>>> response = JsonResponse(data, encoder=MyJSONEncoder)
StreamingHttpResponse
объекты ¶
-
класс
StreamingHttpResponse
¶
StreamingHttpResponse
Класс используется для потоковой передачи ответа от Джанго в браузере. Вы можете сделать это, если создание ответа занимает слишком много времени или использует слишком много памяти. Например, это полезно для
создания больших файлов CSV .
Соображения производительности
Django разработан для краткосрочных запросов. Потоковая передача ответов будет связывать рабочий процесс на все время ответа. Это может привести к снижению производительности.
Вообще говоря, вам следует выполнять дорогостоящие задачи вне цикла запрос-ответ, а не прибегать к потоковому ответу.
Это StreamingHttpResponse
не подкласс HttpResponse
, потому что он имеет немного другой API. Однако он почти идентичен, со следующими заметными отличиями:
- Ему должен быть предоставлен итератор, который выдает байтовые строки в качестве содержимого.
- Вы не можете получить доступ к его содержимому, кроме как итерации самого объекта ответа. Это должно происходить только тогда, когда ответ возвращается клиенту.
- У него нет
content
атрибута. Вместо этого у него естьstreaming_content
атрибут. - Вы не можете использовать файловый объект
tell()
илиwrite()
методы. Это вызовет исключение.
StreamingHttpResponse
следует использовать только в ситуациях, когда абсолютно необходимо, чтобы весь контент не повторялся перед передачей данных клиенту. Поскольку доступ к контенту невозможен, многие промежуточные программы не могут нормально работать. Например, заголовки ETag
и
Content-Length
не могут быть созданы для потоковых ответов.
Атрибуты ¶
-
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
имени нет или имя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'))
Файл будет закрыт автоматически, поэтому не открывайте его с помощью диспетчера контекста.