• 3.2
  • 5.0
  • 6.1
  • Версия документации: 3.1

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

Быстрый обзор

Django использует объекты ответа и запроса, чтобы передавать состояние в системе.

Когда запрашивает страница, Django создает объект HttpRequest, который содержит различные данные о запросе. Потом Django определяет и загружает необходимое представление и вызывает его передавая объект HttpRequest первым аргументом. Каждое представление должно вернуть объект HttpResponse.

Этот раздел описывает API объектов HttpRequest и HttpResponse, которые определены в модуле django.http.

Объект HttpRequest

class HttpRequest

Атрибуты

Все атрибуты должны рассматриваться как неизменяемые, пока об обратном не будет сказано явно.

HttpRequest.scheme

Строка, указывающая схему запроса (обычно http или https).

HttpRequest.body

Тело запроса HTTP в байтовой строке. Он полезен для обработки данных различными способами, а не только традиционной HTML формой: передача изображений, загрузка XML и др. Для обработки данных обычной формы, используйте HttpRequest.POST.

Вы также можете читать из HttpRequest, используя файловый интерфейс с HttpRequest.read() или HttpRequest.readline(). Доступ к атрибуту body после чтения запроса с помощью любого из этих методов потока ввода-вывода приведет к возникновению исключения RawPostDataException.

HttpRequest.path

A string representing the full path to the requested page, not including the scheme or domain.

Например: "/music/bands/the_beatles/"

HttpRequest.path_info

В некоторых конфигурациях веб-сервера часть URL-адреса после имени хоста разделяется на часть префикса сценария и часть информации о пути. Атрибут path_info всегда содержит информацию о пути, независимо от того, какой веб-сервер используется. Использование этого вместо path может облегчить перемещение вашего кода между серверами тестирования и развертывания.

Например, если WSGIScriptAlias равен "/minfo", атрибут path может быть равен "/minfo/music/bands/the_beatles/" в то время как path_info будет равен "/music/bands/the_beatles/".

HttpRequest.method

Строка отображающая метод HTTP запроса. Значение всегда будет в верхнем регистре. Например:

if request.method == 'GET':
    do_something()
elif request.method == 'POST':
    do_something_else()
HttpRequest.encoding

Кодировка, которая используется для декодирования данных формы (или None, что означает использовать значение настройки DEFAULT_CHARSET). Вы можете изменить значение этого атрибута. При последующих доступах к атрибутам (например, чтение с GET или POST) будет использоваться новое значение encoding. Полезен, если вы знаете, что данные формы не используют кодировку указанную DEFAULT_CHARSET.

HttpRequest.content_type

Строка, указывающая схему запроса (обычно http или https).

HttpRequest.content_params

Словарь параметров ключ/значение, включенный в заголовок CONTENT_TYPE.

HttpRequest.GET

Объект с интерфейсом словаря, который содержит HTTP GET параметры. Смотрите описание QueryDict ниже.

HttpRequest.POST

Объект-словарь содержащий все POST параметры, переданные формой. Смотрите описание QueryDict ниже. Если вам необходимо получить необработанные данные или данные переданные не через форму, используйте атрибут HttpRequest.body.

Запрос может использовать метод POST но содержать пустой словарь POST – например, форма была передана через POST HTTP метод, но не содержала никаких данных. Поэтому, вы не должны использовать if request.POST для проверки был ли использован метод POST; вместо этого используйте if request.method == "POST" (смотрите ниже).

Заметим: POST не содержит информацию о загруженных файлах. Смотрите FILES.

HttpRequest.COOKIES

Словарь Python содержащий все «cookie». Ключи и значения являются строками.

HttpRequest.FILES

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

Подробности в разделе Управление файлами.

Заметим, что FILES содержит данные только, если метод запроса POST и <form> содержал enctype="multipart/form-data". В другом случае FILES будет содержать пустой словарь.

HttpRequest.META

Словарь Python содержащий все доступные HTTP заголовки запроса. Доступные заголовки зависят от сервера и клиента. Вот список возможных:

  • CONTENT_LENGTH – размер содержимого запроса (содержимое учитывается как строка).

  • CONTENT_TYPE – MIME-тип содержимого запроса.

  • HTTP_ACCEPT – принимаемые типы ответа ответа.

  • HTTP_ACCEPT_ENCODING – принимаемые кодировки ответа.

  • HTTP_ACCEPT_LANGUAGE – принимаемые языки ответа.

  • HTTP_HOST – заголовок HTTP Host отсылаемый клиентом.

  • HTTP_REFERER – Ссылающаяся страница, если определена.

  • HTTP_USER_AGENT – Строка «user-agent» клиента.

  • QUERY_STRING – Строка запроса, не обработанная.

  • REMOTE_ADDR – IP-адрес клиента.

  • REMOTE_HOST – имя хоста клиента.

  • REMOTE_USER – Пользователь, аутентифицированный веб-сервером, если таковой имеется.

  • REQUEST_METHOD – Метод запроса. Строка, например, "GET" или "POST".

  • SERVER_NAME – имя хоста сервера.

  • SERVER_PORT – Порт сервера(строка).

За исключением CONTENT_LENGTH и CONTENT_TYPE из примера выше, любый HTTP заголовок запроса преобразуется в ключ атрибута META конвертированием всех символов в верхний регистр, заменой дефисов нижним подчеркиванием и добавлением префикса HTTP_ к названию. Например, заголовок X-Bender будет добавлен в META с ключом HTTP_X_BENDER.

Обратите внимание, что runserver удаляет все заголовки с подчеркиваниями в имени, поэтому вы не увидите их в META. Это предотвращает подмену заголовка, основанную на неоднозначности между подчеркиваниями и тире, которые нормализуются на подчеркивания в переменных среды WSGI. Оно соответствует поведению веб-серверов, таких как Nginx и Apache 2.4+.

HttpRequest.headers — это более простой способ доступа ко всем заголовкам с префиксом HTTP, а также CONTENT_LENGTH и CONTENT_TYPE.

HttpRequest.headers

Нечувствительный к регистру объект, подобный dict, который обеспечивает доступ ко всем заголовкам с префиксом HTTP (плюс Content-Length и Content-Type) из запроса.

The name of each header is stylized with title-casing (e.g. User-Agent) when it’s displayed. You can access headers case-insensitively:

>>> 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)

For use in, for example, Django templates, headers can also be looked up using underscores in place of hyphens:

{{ request.headers.user_agent }}
Changed in Django 3.0:

Support for lookups using underscores was added.

HttpRequest.resolver_match

Экземпляр ResolverMatch представляющий запрошенный URL. Атрибут устанавливается при поиске подходящего URL-шаблона, это значит что middleware он не доступен т.к. они вызывается до обработки URL-а (в таком случае вместо process_request можно использовать process_view).

Атрибуты, которые могут добавляться кодом приложения

Django не устанавливает эти атрибуты, но использует их, если ваше приложение установит их.

HttpRequest.current_app

Шаблонный тег url будет использовать значение этого атрибута как аргумент current_app для reverse().

HttpRequest.urlconf

Будет использоваться как URLconf текущего запроса вместо значения настройки ROOT_URLCONF. Подробности смотрите в разделе Как Django обрабатывает запрос.

urlconf можно установить в None, чтобы отменить какие-либо изменения, сделанные предыдущими промежуточными слоями, и снова использовать ROOT_URLCONF.

HttpRequest.exception_reporter_filter

Это будет использоваться вместо DEFAULT_EXCEPTION_REPORTER_FILTER для текущего запроса. Подробности смотрите в Настройка отчета об ошибке.

HttpRequest.exception_reporter_class

Это будет использоваться вместо DEFAULT_EXCEPTION_REPORTER для текущего запроса. Подробности смотрите в Настройка отчета об ошибке.

Атрибуты, которые устанавливаются промежуточным слоем(middleware)

Некоторые промежуточные слои, включая встроенные в Django, добавляют атрибуты к объекту запроса. Если вы не нашли атрибут в объекте запроса, убедитесь, что нужный промежуточный слой добавлен в MIDDLEWARE_CLASSES.

HttpRequest.session

Добавляется SessionMiddleware: объект с интерфейсом словаря, который содержит текущую сессию.

HttpRequest.site

Добавляется CurrentSiteMiddleware: экземпляр Site или RequestSite, который возвращается get_current_site(), отображает текущий сайт.

HttpRequest.user

Добавляется AuthenticationMiddleware: содержит объект AUTH_USER_MODEL представляющий текущего пользователя. Если пользователь не авторизирован, атрибут user будет содержать django.contrib.auth.models.AnonymousUser. Вы можете различить их используя is_authenticated():

if request.user.is_authenticated:
    ... # Do something for logged-in users.
else:
    ... # Do something for anonymous users.

Методы

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() вернет ошибку если сервер находится за несколькими proxy. Одно из решений – создать функциональный слой(middleware), который переопределить заголовки proxy таким образом:

class MultipleProxyMiddleware:
    FORWARDED_FOR_FIELDS = [
        'HTTP_X_FORWARDED_FOR',
        'HTTP_X_FORWARDED_HOST',
        'HTTP_X_FORWARDED_SERVER',
    ]

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        """
        Rewrites the proxy headers so that only the most
        recent proxy is used.
        """
        for field in self.FORWARDED_FOR_FIELDS:
            if field in request.META:
                if ',' in request.META[field]:
                    parts = request.META[field].split(',')
                    request.META[field] = parts[-1].strip()
        return self.get_response(request)

Этот функциональный слой должен находиться перед любый другим, который может использовать get_host(), например, CommonMiddleware или CsrfViewMiddleware.

HttpRequest.get_port()

Возвращает оригинальный порт запроса, используя данные из HTTP_X_FORWARDED_PORT (если включена настройка USE_X_FORWARDED_PORT) и значение SERVER_PORT из META в указанном порядке.

HttpRequest.get_full_path()

Возвращает path, со строкой запроса, если она присутствует.

Например: "/music/bands/the_beatles/?print=true"

HttpRequest.get_full_path_info()

Аналогично get_full_path(), но использует path_info вместо path.

Например: "/music/bands/the_beatles/?print=true"

HttpRequest.build_absolute_uri(location=None)

Возвращает абсолютный URI для аргумента location. Если location не указан, будет использовано значение request.get_full_path().

Если location уже является абсолютным URI, значение останется не измененным. В другом случае абсолютный URI будет создан с использованием данных запроса.

>>> request.build_absolute_uri()
'https://example.com/music/bands/the_beatles/?print=true'
>>> request.build_absolute_uri('/bands/')
'https://example.com/bands/'
>>> request.build_absolute_uri('https://example2.com/bands/')
'https://example2.com/bands/'

Примечание

Смешивание HTTP и HTTPS на одном сайте не рекомендуется, поэтому build_absolute_uri() всегда будет генерировать абсолютный URI с той же схемой, что и текущий запрос. Если вам нужно перенаправить пользователей на HTTPS, лучше всего разрешить вашему веб-серверу перенаправлять весь HTTP-трафик на HTTPS.

Возвращает значение подписанных(signed) cookie, или вызывает исключение django.core.signing.BadSignature если подпись не верна. При передаче аргумента default исключение не будет вызвано и функция вернет значение по-умолчанию.

Необязательный аргумент salt может быть использован для дополнительной защиты от « brute force» атак. Если передан аргумент max_age, время подписи cookie будет проверяться, чтобы убедиться, что cookie не старше max_age секунд.

Например:

>>> request.get_signed_cookie('name')
'Tony'
>>> request.get_signed_cookie('name', salt='name-salt')
'Tony' # assuming cookie was set using the same salt
>>> request.get_signed_cookie('nonexistent-cookie')
...
KeyError: 'nonexistent-cookie'
>>> request.get_signed_cookie('nonexistent-cookie', False)
False
>>> request.get_signed_cookie('cookie-that-was-tampered-with')
...
BadSignature: ...
>>> request.get_signed_cookie('name', max_age=60)
...
SignatureExpired: Signature age 1677.3839159 > 60 seconds
>>> request.get_signed_cookie('name', False, max_age=60)
False

Подробности смотрите в разделе о криптографической подписи.

HttpRequest.is_secure()

Возвращает True если запрос безопасный; то есть, если он был выполнен через HTTPS.

HttpRequest.accepts(mime_type)
New in Django 3.1.

Returns True if the request Accept header matches the mime_type argument:

>>> request.accepts('text/html')
True

Большинство браузеров по умолчанию отправляют Accept: */*, поэтому для всех типов контента будет возвращено True. Установка явного заголовка Accept в запросах API может быть полезна для возврата другого типа контента только для этих потребителей. См. пример использования «accepts()» для возврата различного контента потребителям API.

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

HttpRequest.is_ajax()

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

Returns True if the request was made via an XMLHttpRequest, by checking the HTTP_X_REQUESTED_WITH header for the string 'XMLHttpRequest'. Most modern JavaScript libraries send this header. If you write your own XMLHttpRequest call (on the browser side), you’ll have to set this header manually if you want is_ajax() to work.

If a response varies on whether or not it’s requested via AJAX and you are using some form of caching like Django’s cache middleware, you should decorate the view with vary_on_headers('X-Requested-With') so that the responses are properly cached.

HttpRequest.read(size=None)
HttpRequest.readline()
HttpRequest.readlines()
HttpRequest.__iter__()

Методы, предоставляющие интерфейс файла для чтения данных из объекта HttpRequest. Это дает возможность читать содержимое запроса в потоке. Один из вариантов использования – это обработка большого XML-документа «парсером», без создания всего XML-дерева в памяти.

Предоставляя стандартный интерфейс, объект HttpRequest можно передавать непосредственно в XML-парсер такой как ElementTree:

import xml.etree.ElementTree as ET
for element in ET.iterparse(request):
    process(element)

Объект QueryDict

class QueryDict

В объекте HttpRequest, атрибуты GET и POST являются экземплярами класса django.http.QueryDict – это класс с интерфейсом словаря, который дополнительной хранить несколько значений для одного ключа. Это необходимо так как определенные элементы HTML-форм(например, <select multiple>) передают несколько значений для одного ключа.

QueryDict из request.POST и request.GET – неизменяемы. Чтобы получить изменяемую версию, используйте .copy().

Методы

Класс QueryDict представляет все стандартные методы словаря, так как является его подклассом. Исключения описаны здесь:

QueryDict.__init__(query_string=None, mutable=False, encoding=None)

Создает экземпляр QueryDict из query_string.

>>> QueryDict('a=1&a=2&c=3')
<QueryDict: {'a': ['1', '2'], 'c': ['3']}>

Если параметр query_string не указан, полученный QueryDict будет пустым (без ключей и значений).

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

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

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

Creates a new QueryDict with keys from iterable and each value equal to value. For example:

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

Возвращает значение для переданного ключа. Если ключа содержит несколько значений, __getitem__() возвращает последнее значение. Вызывает исключение django.utils.datastructures.MultiValueDictKeyError если ключ не существует. (Это подкласс стандартного исключения Python KeyError, так что вы как обычно можете обрабатывать исключение KeyError.)

QueryDict.__setitem__(key, value)

Устанавливает значения ключа в [value] (список Python с единственным элементом value). Заметим, что это, так же как и другие методы словаря изменяющие значения, могут быть вызваны только для изменяемого объекта QueryDict (который был создан через copy()).

QueryDict.__contains__(key)

Возвращает True если переданный ключ существует. Это позволяет вам использовать if "foo" in request.GET.

QueryDict.get(key, default=None)

Аналогичен методу __getitem__(), но возвращает значение по-умолчанию вместо исключения, если ключ не существует.

QueryDict.setdefault(key, default=None)

Аналогичен методу setdefault() словаря, но использует метод __setitem__().

QueryDict.update(other_dict)

Takes either a QueryDict or a dictionary. Like dict.update(), except it appends to the current dictionary items rather than replacing them. For example:

>>> q = QueryDict('a=1', mutable=True)
>>> q.update({'a': '2'})
>>> q.getlist('a')
['1', '2']
>>> q['a'] # returns the last
'2'
QueryDict.items()

Like dict.items(), except this uses the same last-value logic as __getitem__() and returns an iterator object instead of a view object. For example:

>>> q = QueryDict('a=1&a=2&a=3')
>>> list(q.items())
[('a', '3')]
QueryDict.values()

Like dict.values(), except this uses the same last-value logic as __getitem__() and returns an iterator instead of a view object. For example:

>>> q = QueryDict('a=1&a=2&a=3')
>>> list(q.values())
['3']

В дополнение, QueryDict содержит такие методы:

QueryDict.copy()

Возвращает копию объекта, используя copy.deepcopy() из стандартных библиотек Python. Копия будет изменяемая, даже если оригинал не был.

QueryDict.getlist(key, default=None)

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

QueryDict.setlist(key, list_)

Устанавливает значение ключа в список list_ (в отличии от __setitem__()).

QueryDict.appendlist(key, item)

Добавляет элемент во внутренний список значений ключа.

QueryDict.setlistdefault(key, default_list=None)

Аналогичен setdefault, но принимает список значений, а не одно значение.

QueryDict.lists()

Like items(), except it includes all values, as a list, for each member of the dictionary. For example:

>>> q = QueryDict('a=1&a=2&a=3')
>>> q.lists()
[('a', ['1', '2', '3'])]
QueryDict.pop(key)

Returns a list of values for the given key and removes them from the dictionary. Raises KeyError if the key does not exist. For example:

>>> q = QueryDict('a=1&a=2&a=3', mutable=True)
>>> q.pop('a')
['1', '2', '3']
QueryDict.popitem()

Removes an arbitrary member of the dictionary (since there’s no concept of ordering), and returns a two value tuple containing the key and a list of all values for the key. Raises KeyError when called on an empty dictionary. For example:

>>> q = QueryDict('a=1&a=2&a=3', mutable=True)
>>> q.popitem()
('a', ['1', '2', '3'])
QueryDict.dict()

Returns a dict representation of QueryDict. For every (key, list) pair in QueryDict, dict will have (key, item), where item is one element of the list, using the same logic as QueryDict.__getitem__():

>>> q = QueryDict('a=1&a=3&a=5')
>>> q.dict()
{'a': '5'}
QueryDict.urlencode(safe=None)

Returns a string of the data in query string format. For example:

>>> q = QueryDict('a=2&b=3&b=5')
>>> q.urlencode()
'a=2&b=3&b=5'

Use the safe parameter to pass characters which don’t require encoding. For example:

>>> q = QueryDict(mutable=True)
>>> q['next'] = '/a&b/'
>>> q.urlencode(safe='/')
'next=/a%26b/'

Объект HttpResponse

class HttpResponse

В отличии от объекта HttpRequest, который создается Django, объект HttpResponse создаете вы. Каждое представление должно создать и вернуть объект HttpResponse.

Класс HttpResponse находится в модуле django.http.

Использование

Передача строки

Typical usage is to pass the contents of the page, as a string, bytestring, or memoryview, to the HttpResponse constructor:

>>> 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.'))
Changed in Django 3.0:

Support for memoryview was added.

But if you want to add content incrementally, you can use response as a file-like object:

>>> response = HttpResponse()
>>> response.write("<p>Here's the text of the Web page.</p>")
>>> response.write("<p>Here's another paragraph.</p>")

Передача итератора

Вы можете передать итератор в конструктор HttpResponse вместо строк. HttpResponse сразу выполнит итератор и сохранит результат как строку.

Если необходимо отдавать данные из итератора в потоке, используйте экземпляр StreamingHttpResponse.

Установка заголовков

To set or remove a header field in your response, treat it like a dictionary:

>>> response = HttpResponse()
>>> response['Age'] = 120
>>> del response['Age']

Note that unlike a dictionary, del doesn’t raise KeyError if the header field doesn’t exist.

Для установки заголовков Cache-Control и Vary, лучше использовать функции patch_cache_control() и patch_vary_headers() из модуля django.utils.cache, так как эти поля могут содержать несколько значений, разделенных запятыми. Эти функции добавят новые значение не удаляя существующие.

HTTP заголовки не могут содержать перенос строки. При попытке добавить заголовок содержащий символ переноса строки (CR или LF) будет вызвано исключение BadHeaderError

Указываем браузеру воспринимать ответ как вложенный файл

To tell the browser to treat the response as a file attachment, use the content_type argument and set the Content-Disposition header. For example, this is how you might return a Microsoft Excel spreadsheet:

>>> response = HttpResponse(my_data, content_type='application/vnd.ms-excel')
>>> response['Content-Disposition'] = 'attachment; filename="foo.xls"'

Заголовок Content-Disposition никак не относится к Django, но очень легко забыть синтаксис, поэтому мы добавили пример.

Атрибуты

HttpResponse.content

Байтовое представление содержимого, закодированное с объекта Unicode при необходимости.

HttpResponse.charset

Кодировка, в которую будет закодирован ответ. Если не указана во время создания объекта HttpResponse, будет проверятся content_type, и если не будет найдена, будет использоваться значение настройки DEFAULT_CHARSET.

HttpResponse.status_code

The HTTP status code for the response.

Если reason_phrase не установлен явно, изменение status_code вне конструктора также изменит reason_phrase.

HttpResponse.reason_phrase

The HTTP reason phrase for the response. It uses the HTTP standard’s default reason phrases.

Если не указан явно, reason_phrase определяется из текущего значения status_code.

HttpResponse.streaming

Всегда False.

Указывает middleware, что этот ответ потоковый и его нужно обрабатывать не так, как обычные запросы.

HttpResponse.closed

True, если ответ был закрыт.

Методы

HttpResponse.__init__(content=b'', content_type=None, status=200, reason=None, charset=None)

Instantiates an HttpResponse object with the given page content and content type.

content чаще всего представляет собой итератор, байтовую строку, memoryview или строку. Другие типы будут преобразованы в байтовую строку путем кодирования их строкового представления. Итераторы должны возвращать строки или байтовые строки, и они будут объединены вместе, чтобы сформировать содержимое ответа.

content_type — это тип MIME, дополнительно дополненный кодировкой набора символов, и используется для заполнения HTTP-заголовка Content-Type. Если не указано, он формируется из 'text/html' и настроек DEFAULT_CHARSET, по умолчанию: "text/html; charset=utf-8".

status is the HTTP status code for the response. You can use Python’s http.HTTPStatus for meaningful aliases, such as HTTPStatus.NO_CONTENT.

reason – это описание HTTP ответа. Если не указано, будет использоваться стандартное значение.

charset - кодировка, в которую будет закодирован ответ. Если не указана во время создания объекта HttpResponse, будет проверятся content_type, и если не будет найдена, будет использоваться значение настройки DEFAULT_CHARSET.

Changed in Django 3.0:

Support for memoryview content was added.

HttpResponse.__setitem__(header, value)

Устанавливает заголовок ответа. header и value должны быть строками.

HttpResponse.__delitem__(header)

Удаляет заголовок ответа. Не вызывает исключения, если заголовок не существует. Регистронезависимый.

HttpResponse.__getitem__(header)

Возвращает значение заголовка. Регистрозависимый.

HttpResponse.get(header, alternate=None)

Возвращает значение для данного заголовка или его альтернативное значение, если заголовок не существует.

HttpResponse.has_header(header)

Возвращает True или False в результате регистронезависимого поиска заголовка по указанному названию.

HttpResponse.items()

Действует как dict.items() для HTTP-заголовков в ответе.

HttpResponse.setdefault(header, value)

Устанавливает заголовок, если он еще не был установлен.

Устанавливает cookie. Аргументы соответствуют аргументам для конструктора объекта Morsel из стандартных библиотек Python.

  • max_age should be a number of seconds, or None (default) if the cookie should last only as long as the client’s browser session. If expires is not specified, it will be calculated.

  • expires должен быть строкой в формате "Wdy, DD-Mon-YY HH:MM:SS GMT" или объект datetime.datetime в UTC. Если expires объект datetime, значение max_age будет вычислено.

  • Используйте domain если хотите установить междоменные cookie. Например, domain=".lawrence.com" установит cookie доступные для доменов www.lawrence.com, blogs.lawrence.com и calendars.lawrence.com. Иначе, cookie будут доступны только для текущего домена.

  • Используйте secure=True, если вы хотите, чтобы файлы cookie отправлялись на сервер только при выполнении запроса по схеме https.

  • Используйте httponly=True, если хотите ограничит доступ клиентского JavaScript к этим cookie.

    HTTPOnly – это флаг добавляемый в HTTP заголовок Set-Cookie ответа. Он не является частью стандарта RFC 2109, и поддерживается не всеми браузерами. Однако, если он поддерживается, это может быть полезным для уменьшения риска, что клиентский скрипт получит доступа к защищенным данным cookie.

  • Используйте Samesite=“Strict“`` или samesite='Lax', чтобы указать браузеру не отправлять этот файл cookie при выполнении запроса между источниками. SameSite поддерживается не всеми браузерами, поэтому это не замена CSRF-защиты Django, а скорее мера глубокоэшелонированной защиты.

    Используйте samesite='None' (строка), чтобы явно указать, что этот файл cookie отправляется со всеми односайтовыми и межсайтовыми запросами.

Changed in Django 3.1:

Using samesite='None' (string) was allowed.

Предупреждение

Спецификации RFC 2109 и RFC 6265 указывают, что клиент должен поддерживать куки минимального размера 4096 байт. Для большинства браузеров это максимальный размер кук. Django не вызовет исключение, если вы попытаетесь добавить куки больше 4096 байт, но многие браузеры установят их неправильно.

Аналогичен set_cookie(), но использует криптографическую подписаь перед установкой cookie. Используется вместе с методом HttpRequest.get_signed_cookie(). Вы можете использовать не обязательный аргумент salt для дополнительной защиты, но не забывайте добавлять его при вызове HttpRequest.get_signed_cookie().

Changed in Django 3.1:

Using samesite='None' (string) was allowed.

Удаляет cookie. Не вызывает исключения, если cookie не существует.

Учитывая механизм работы cookie, значения path и domain должны быть такими же, какие использовались при вызове set_cookie() – в противном случае cookie могут быть не удалены.

Changed in Django 2.2.15:

The samesite argument was added.

HttpResponse.close()

Этот метод вызывается в конце запроса непосредственно сервером WSGI.

HttpResponse.write(content)

Метод для соблюдения интерфейса объекта файла.

HttpResponse.flush()

Метод для соблюдения интерфейса объекта файла.

HttpResponse.tell()

Метод для соблюдения интерфейса объекта файла.

HttpResponse.getvalue()

Возвращает значение HttpResponse.content. Этот метод позволяет использовать HttpResponse как объект-файл.

HttpResponse.readable()

Всегда True. Этот метод позволяет использовать HttpResponse как объект-файл.

HttpResponse.seekable()

Всегда True. Этот метод позволяет использовать HttpResponse как объект-файл.

HttpResponse.writable()

Всегда True. Этот метод позволяет использовать HttpResponse как объект-файл.

HttpResponse.writelines(lines)

Записывает список строк в ответ. Разделители строк не добавляются. Этот метод позволяет использовать HttpResponse как объект-файл.

Подклассы HttpResponse

Django содержит несколько подклассов HttpResponse, которые представляют различные типы HTTP ответов. Как и HttpResponse, эти подклассы находятся в модуле django.http.

class HttpResponseRedirect

Конструктор принимает один обязательный аргумент – путь для перенаправления. Это может быть полный URL (например, 'https://www.yahoo.com/search/') или абсолютный путь без домена (например, '/search/'). Дополнительные необязательные аргументы можно найти в описании HttpResponse. Возвращает код HTTP состояния равный 302.

url

Этот атрибут, доступный только для чтения, содержит URL для редиректа (аналог заголовка Location).

class HttpResponsePermanentRedirect

Аналогичен HttpResponseRedirect, но возвращает постоянное перенаправление (код HTTP состояния 301) вместо временного перенаправления (код состояния 302).

class HttpResponseNotModified

Конструктор не принимает аргументы и ответ должен быть пустым. Используйте, чтобы указать, что страница не изменилась с прошлого запроса пользователя (код состояния 304).

class HttpResponseBadRequest

Аналогичен HttpResponse но использует код состояния 400.

class HttpResponseNotFound

Аналогичен HttpResponse но использует код состояния 404.

class HttpResponseForbidden

Аналогичен HttpResponse но использует код состояния 403.

class HttpResponseNotAllowed

Аналогичен HttpResponse, но использует код состояния 405. Обязательный аргумент: список разрешенных методов (например, ['GET', 'POST']).

class HttpResponseGone

Аналогичен HttpResponse но использует код состояния 410.

class HttpResponseServerError

Аналогичен HttpResponse но использует код состояния 500.

Примечание

Если ваш подкласс HttpResponse содержит метод render, Django воспринимает его как аналог класса SimpleTemplateResponse. Метод render должен возвращать правильный объект ответа.

Подклассы HttpResponse

Если вам нужен класс ответа, которого нет в Django, вы можете создать его с помощью http.HTTPStatus. Например:

from http import HTTPStatus
from django.http import HttpResponse

class HttpResponseNoContent(HttpResponse):
    status_code = HTTPStatus.NO_CONTENT

Объект JsonResponse

class JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs)

Дочерний класс HttpResponse, который помогает вернуть ответ в JSON. Наследует большую часть поведения родительского класса с некоторыми исключениями:

Его заголовок Content-Type по умолчанию имеет значение application/json.

Первый параметр data должен быть словарем. Если параметр safe равен False (смотрите ниже), может принимать любой объект, который можно преобразовать в JSON.

encoder, по умолчанию равен django.core.serializers.json.DjangoJSONEncoder, будет использовать для преобразования данных. Подрбности смотрите в JSON сериализации.

Параметр safe по умолчанию равен True. Если равен False, можно передать любой объект для преобразования в JSON (иначе – только dict). Если safe равен True и передали не dict объект, будет вызвано исключение TypeError.

Аргумент json_dumps_params содержит словарь именованных переменных, который передаются в json.dumps() при генерации ответа.

Использование

Typical usage could look like:

>>> from django.http import JsonResponse
>>> response = JsonResponse({'foo': 'bar'})
>>> response.content
b'{"foo": "bar"}'

Преобразование не словарей

In order to serialize objects other than dict you must set the safe parameter to False:

>>> response = JsonResponse([1, 2, 3], safe=False)

При safe=False будет вызвано исключение TypeError.

Предупреждение

Before the 5th edition of ECMAScript it was possible to poison the JavaScript Array constructor. For this reason, Django does not allow passing non-dict objects to the JsonResponse constructor by default. However, most modern browsers implement EcmaScript 5 which removes this attack vector. Therefore it is possible to disable this security precaution.

Переопределяем преобразователь в JSON

If you need to use a different JSON encoder class you can pass the encoder parameter to the constructor method:

>>> response = JsonResponse(data, encoder=MyJSONEncoder)

Объекты StreamingHttpResponse

class StreamingHttpResponse

The StreamingHttpResponse class is used to stream a response from Django to the browser. You might want to do this if generating the response takes too long or uses too much memory. For instance, it’s useful for generating large CSV files.

О производительности

Django is designed for short-lived requests. Streaming responses will tie a worker process for the entire duration of the response. This may result in poor performance.

Generally speaking, you should perform expensive tasks outside of the request-response cycle, rather than resorting to a streamed response.

StreamingHttpResponse не является подклассом HttpResponse и предоставляет немного другое API. Однако, они очень похожи со следующими отличиями:

  • It should be given an iterator that yields bytestrings as content.

  • You cannot access its content, except by iterating the response object itself. This should only occur when the response is returned to the client.

  • It has no content attribute. Instead, it has a streaming_content attribute.

  • Вы не можете использовать методы объекта файла tell() или write(). Это вызовет исключение.

StreamingHttpResponse should only be used in situations where it is absolutely required that the whole content isn’t iterated before transferring the data to the client. Because the content can’t be accessed, many middleware can’t function normally. For example the ETag and Content-Length headers can’t be generated for streaming responses.

Атрибуты

StreamingHttpResponse.streaming_content

Итератор содержимого ответа, байтовая строка, закодированная в соответствии с HttpResponse.charset.

StreamingHttpResponse.status_code

The HTTP status code for the response.

Если reason_phrase не установлен явно, изменение status_code вне конструктора также изменит reason_phrase.

StreamingHttpResponse.reason_phrase

The HTTP reason phrase for the response. It uses the HTTP standard’s default reason phrases.

Если не указан явно, 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, ваша задача — искать его() перед передачей в FileResponse.

The Content-Length and Content-Type headers are automatically set when they can be guessed from contents of open_file.

FileResponse accepts any file-like object with binary content, for example a file open in binary mode like so:

>>> from django.http import FileResponse
>>> response = FileResponse(open('myfile.png', 'rb'))

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

Методы

FileResponse.set_headers(open_file)

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

Back to Top