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

Быстрый просмотр

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 .

classmethodQueryDict.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 если ключ не существует (это исключение наследуется от стандартного исключения 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( ключ , по умолчанию = Нет )

Возвращает список данных, соответствующих запрошенному ключу. Возвращает пустой список, если ключ не существует и не указано значение по умолчанию. Во всех случаях он возвращает список, если только значение по умолчанию не является списком.

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.'))
Изменено в Django 3.0:

Поддержка 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, который может быть дополнительно дополнен кодировкой набора символов и используется для заполнения заголовка HTTP Content-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 as memoryview .

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

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 и в качестве первого параметра передается объект, не являющийся словарем, генерируется исключение 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

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 него нет имени или если имя неверно, укажите пользовательское имя файла с помощью параметра 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