Объекты запроса и ответа

Краткий обзор

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.POSTif request.method == "POST"HttpRequest.method

POSTэто не включает информацию файла загрузки. Смотрите FILES.

HttpRequest.COOKIES

Словарь, содержащий все файлы cookie. Ключи и значения представляют собой строки.

HttpRequest.FILES

Словарный объект, содержащий все загруженные файлы. Каждая клавиша FILES- это nameот . Каждое значение в формате .<input type="file" name="">FILESUploadedFile

См. Раздел Управление файлами для получения дополнительной информации.

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: */*TrueAcceptaccepts()

Если ответ зависит от содержимого Acceptзаголовка и вы используете какую-либо форму кеширования, например, в Django , вам следует украсить представление, чтобы ответы правильно кэшировались.cache middlewarevary_on_headers('Accept')

HttpRequest.is_ajax()

Не рекомендуется, начиная с версии 3.1.

Возвращает, Trueесли запрос был сделан через XMLHttpRequest, путем проверки HTTP_X_REQUESTED_WITHзаголовка строки 'XMLHttpRequest'. Большинство современных библиотек JavaScript отправляют этот заголовок. Если вы пишете свой собственный XMLHttpRequestвызов (на стороне браузера), вам придется установить этот заголовок вручную, если вы хотите is_ajax()работать.

Если ответ зависит от того, запрошен он через AJAX или нет, и вы используете какую-либо форму кеширования, такую ​​как Django , вам следует украсить представление, чтобы ответы были правильно кэшированы.cache middlewarevary_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>

Значения QueryDicts 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будет пустым (не будет иметь ключей или значений).

Большинство QueryDicts вы столкнулись, и в частности, на request.POSTи request.GET, будет неизменен. Если вы создаете один экземпляр самостоятельно, вы можете сделать его изменяемым, передав mutable=Trueего __init__().

Строки для установки ключей и значений будут преобразованы из encoding в str. Если encodingне установлен, по умолчанию используется DEFAULT_CHARSET.

classmethodQueryDict.fromkeys ( iterable , value = '' , mutable = False , encoding = None )

Создает новый объект QueryDictс ключами from iterableи каждым значением, равным value. Например:

>>> QueryDict.fromkeys(['a', 'a', 'b'], value='val')
<QueryDict: {'a': ['val', 'val'], 'b': ['val']}>
QueryDict.__getitem__( ключ )

Возвращает значение для данного ключа. Если ключ имеет более одного значения, он возвращает последнее значение. Возникает, django.utils.datastructures.MultiValueDictKeyErrorесли ключ не существует. (Это подкласс стандарта Python KeyError, поэтому вы можете продолжать ловить 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

Изменено в Django 3.2:

Добавлен 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.datetimeexpiresdatetimemax_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объекты

classJsonResponse ( 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объекты

classFileResponse ( 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'))

Файл будет закрыт автоматически, поэтому не открывайте его с помощью диспетчера контекста.

Методы

FileResponse.set_headers( открытый_файл )

Этот метод вызывается автоматически во время инициализации реакции и набора различных заголовков ( Content-Length, Content-Typeи Content-Disposition) в зависимости от open_file.

Copyright ©2021 All rights reserved