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

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

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

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

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

HttpRequest objects

class HttpRequest

Атрибуты

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

HttpRequest.scheme

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

HttpRequest.body

The raw HTTP request body as a bytestring. This is useful for processing data in different ways than conventional HTML forms: binary images, XML payload etc. For processing conventional form data, use HttpRequest.POST.

You can also read from an HttpRequest using a file-like interface. See HttpRequest.read().

HttpRequest.path

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

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

HttpRequest.path_info

Для некоторых конфигурация сервера, часть URL-а после названия домена содержит префикс скрипта и «полезную» часть пути(path info portion). Атрибут path_info всегда содержит часть URL-а, которую использует Django, не зависимо от сервера . Использование этого атрибута вместо path сделает ваш код более надежным и независимым от настроек сервера.

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

HttpRequest.method

A string representing the HTTP method used in the request. This is guaranteed to be uppercase. For example:

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

A string representing the current encoding used to decode form submission data (or None, which means the DEFAULT_CHARSET setting is used). You can write to this attribute to change the encoding used when accessing the form data. Any subsequent attribute accesses (such as reading from GET or POST) will use the new encoding value. Useful if you know the form data is not in the DEFAULT_CHARSET encoding.

HttpRequest.content_type

A string representing the MIME type of the request, parsed from the CONTENT_TYPE header.

HttpRequest.content_params

A dictionary of key/value parameters included in the CONTENT_TYPE header.

HttpRequest.GET

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

HttpRequest.POST

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

It’s possible that a request can come in via POST with an empty POST dictionary – if, say, a form is requested via the POST HTTP method but does not include form data. Therefore, you shouldn’t use if request.POST to check for use of the POST method; instead, use if request.method == "POST" (see HttpRequest.method).

POST does not include file-upload information. See FILES.

HttpRequest.COOKIES

A dictionary containing all cookies. Keys and values are strings.

HttpRequest.FILES

A dictionary-like object containing all uploaded files. Each key in FILES is the name from the <input type="file" name="">. Each value in FILES is an UploadedFile.

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

FILES will only contain data if the request method was POST and the <form> that posted to the request had enctype="multipart/form-data". Otherwise, FILES will be a blank dictionary-like object.

HttpRequest.META

A dictionary containing all available HTTP headers. Available headers depend on the client and server, but here are some examples:

  • 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 – пользователь аутентифицированный Web-сервером, если определен.
  • REQUEST_METHOD – Метод запроса. Строка, например, "GET" или "POST".
  • SERVER_NAME – имя хоста сервера.
  • SERVER_PORT – Порт сервера(строка).

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

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

HttpRequest.headers is a simpler way to access all HTTP-prefixed headers, plus CONTENT_LENGTH and CONTENT_TYPE.

HttpRequest.headers
New in Django 2.2.

A case insensitive, dict-like object that provides access to all HTTP-prefixed headers (plus Content-Length and Content-Type) from the request.

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

An instance of ResolverMatch representing the resolved URL. This attribute is only set after URL resolving took place, which means it’s available in all views but not in middleware which are executed before URL resolving takes place (you can use it in process_view() though).

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

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

HttpRequest.current_app

The url template tag will use its value as the current_app argument to reverse().

HttpRequest.urlconf

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

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

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

Some of the middleware included in Django’s contrib apps set attributes on the request. If you don’t see the attribute on a request, be sure the appropriate middleware class is listed in MIDDLEWARE.

HttpRequest.session

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

HttpRequest.site

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

HttpRequest.user

From the AuthenticationMiddleware: An instance of AUTH_USER_MODEL representing the currently logged-in user. If the user isn’t currently logged in, user will be set to an instance of AnonymousUser. You can tell them apart with is_authenticated, like so:

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

Like get_full_path(), but uses path_info instead of path.

Example: "/minfo/music/bands/the_beatles/?print=true"

HttpRequest.build_absolute_uri(location=None)

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

If the location is already an absolute URI, it will not be altered. Otherwise the absolute URI is built using the server variables available in this request. For example:

>>> 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/'

Примечание

Mixing HTTP and HTTPS on the same site is discouraged, therefore build_absolute_uri() will always generate an absolute URI with the same scheme the current request has. If you need to redirect users to HTTPS, it’s best to let your Web server redirect all HTTP traffic to 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.is_ajax()

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

Methods implementing a file-like interface for reading from an HttpRequest instance. This makes it possible to consume an incoming request in a streaming fashion. A common use-case would be to process a big XML payload with an iterative parser without constructing a whole XML tree in memory.

Given this standard interface, an HttpRequest instance can be passed directly to an XML parser such as ElementTree:

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

QueryDict objects

class QueryDict

In an HttpRequest object, the GET and POST attributes are instances of django.http.QueryDict, a dictionary-like class customized to deal with multiple values for the same key. This is necessary because some HTML form elements, notably <select multiple>, pass multiple values for the same key.

The QueryDicts at request.POST and request.GET will be immutable when accessed in a normal request/response cycle. To get a mutable version you need to use 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, которые используются в Django, в том числе request.POST и request.GET, будут неизменяемыми. Если вы создаете экземпляр самостоятельно, можете сделать его изменяемым, передав mutable=True в __init__().

Strings for setting both keys and values will be converted from encoding to str. If encoding is not set, it defaults to 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)

Returns the value for the given key. If the key has more than one value, it returns the last value. Raises django.utils.datastructures.MultiValueDictKeyError if the key does not exist. (This is a subclass of Python’s standard KeyError, so you can stick to catching KeyError.)

QueryDict.__setitem__(key, value)

Sets the given key to [value] (a list whose single element is value). Note that this, as other dictionary functions that have side effects, can only be called on a mutable QueryDict (such as one that was created via QueryDict.copy()).

QueryDict.__contains__(key)

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

QueryDict.get(key, default=None)

Uses the same logic as __getitem__(), with a hook for returning a default value if the key doesn’t exist.

QueryDict.setdefault(key, default=None)

Like dict.setdefault(), except it uses __setitem__() internally.

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

Returns a copy of the object using copy.deepcopy(). This copy will be mutable even if the original was not.

QueryDict.getlist(key, default=None)

Returns a list of the data with the requested key. Returns an empty list if the key doesn’t exist and a default value wasn’t provided. It’s guaranteed to return a list unless the default value provided isn’t a list.

QueryDict.setlist(key, list_)

Sets the given key to list_ (unlike __setitem__()).

QueryDict.appendlist(key, item)

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

QueryDict.setlistdefault(key, default_list=None)

Like setdefault(), except it takes a list of values instead of a single value.

QueryDict.lists()

Аналогичен методу items(), но включает все значения списком для каждого элемента словаря. Например:

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

Возвращает список значений для переданного ключа и удаляет его из словаря. Вызывает 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()

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 objects

class HttpResponse

In contrast to HttpRequest objects, which are created automatically by Django, HttpResponse objects are your responsibility. Each view you write is responsible for instantiating, populating, and returning an 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.

Но если вам необходимо добавлять содержимое постепенно, вы можете использовать объект response как объект файла:

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

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

Finally, you can pass HttpResponse an iterator rather than strings. HttpResponse will consume the iterator immediately, store its content as a string, and discard it. Objects with a close() method such as files and generators are immediately closed.

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

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

При установке или удалении заголовка в объекте ответа, рассматривайте его как словарь:

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

Заметим, что в отличии от словаря, del не вызовет исключение KeyError если заголовок не определен.

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

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"'

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

Атрибуты

HttpResponse.content

A bytestring representing the content, encoded from a string if necessary.

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.

Unless explicitly set, reason_phrase is determined by the value of status_code.

HttpResponse.streaming

Всегда False.

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

HttpResponse.closed

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

Методы

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

Создает экземпляр HttpResponse с переданным содержимым и MIME-типом.

content is most commonly an iterator, bytestring, memoryview, or string. Other types will be converted to a bytestring by encoding their string representation. Iterators should return strings or bytestrings and those will be joined together to form the content of the response.

content_type is the MIME type optionally completed by a character set encoding and is used to fill the HTTP Content-Type header. If not specified, it is formed by 'text/html' and the DEFAULT_CHARSET settings, by default: «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.has_header(header)

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

HttpResponse.setdefault(header, value)

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

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

  • max_age должен содержать количество секунд или None (по-умолчанию), если cookie должна существовать до закрытия браузера. Если expires не указан, он будет вычислен.

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

  • Use domain if you want to set a cross-domain cookie. For example, domain="example.com" will set a cookie that is readable by the domains www.example.com, blog.example.com, etc. Otherwise, a cookie will only be readable by the domain that set it.

  • Use secure=True if you want the cookie to be only sent to the server when a request is made with the https scheme.

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

    HttpOnly is a flag included in a Set-Cookie HTTP response header. It’s part of the RFC 6265 standard for cookies and can be a useful way to mitigate the risk of a client-side script accessing the protected cookie data.

  • Use samesite='Strict' or samesite='Lax' to tell the browser not to send this cookie when performing a cross-origin request. SameSite isn’t supported by all browsers, so it’s not a replacement for Django’s CSRF protection, but rather a defense in depth measure.

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

RFC 6265 states that user agents should support cookies of at least 4096 bytes. For many browsers this is also the maximum size. Django will not raise an exception if there’s an attempt to store a cookie of more than 4096 bytes, but many browsers will not set the cookie correctly.

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

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

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

HttpResponse.close()

This method is called at the end of the request directly by the WSGI server, or when the WSGI server closes the file-like object, if wsgi.file_wrapper is used for the request.

HttpResponse.write(content)

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

HttpResponse.flush()

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

HttpResponse.tell()

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

HttpResponse.getvalue()

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

HttpResponse.readable()

Always False. This method makes an HttpResponse instance a stream-like object.

HttpResponse.seekable()

Always False. This method makes an HttpResponse instance a stream-like object.

HttpResponse.writable()

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

HttpResponse.writelines(lines)

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

HttpResponse subclasses

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 должен возвращать правильный объект ответа.

Custom response classes

If you find yourself needing a response class that Django doesn’t provide, you can create it with the help of http.HTTPStatus. For example:

from http import HTTPStatus
from django.http import HttpResponse

class HttpResponseNoContent(HttpResponse):
    status_code = HTTPStatus.NO_CONTENT

JsonResponse objects

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

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

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

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

The encoder, which defaults to django.core.serializers.json.DjangoJSONEncoder, will be used to serialize the data. See JSON serialization for more details about this serializer.

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

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

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

Чтобы использовать другой преобразователь в JSON, передайте его через аргумент encoder конструктора:

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

StreamingHttpResponse objects

class StreamingHttpResponse

Класс StreamingHttpResponse используется для «стриминга» ответа из Django в браузер. Это может пригодится для медленных запросов или требующих большого количества памяти. Например, можно генерировать большие CSV файлы.

Проблемы производительности

Архитектура Django создавалась для обработки быстрых запросов. Потоковые запросы держат рабочий процесс и подключение к БД до окончания обработки запроса. Это может негативно повлиять на производительность.

Сложные задачи следует выполнять вне цикла запрос-ответ и не злоупотреблять потоковыми ответами.

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

  • Принимает итератор строк.
  • Вы не можете обратиться к содержимому ответа кроме как проитерировав объект ответа. Это должно происходить после возвращения ответа клиенту.
  • Не содержит атрибут content. Вместо этого содержит атрибут streaming_content.
  • Вы не можете использовать методы объекта файла 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

An iterator of the response content, bytestring encoded according to 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.

Unless explicitly set, reason_phrase is determined by the value of status_code.

StreamingHttpResponse.streaming

Всегда True.

FileResponse objects

class FileResponse(open_file, as_attachment=False, filename='', **kwargs)

FileResponse – дочерний класс StreamingHttpResponse оптимизированный для работы с бинарными файлами. Использует wsgi.file_wrapper, если он предоставлен wsgi сервером, иначе стримит файл небольшими частями.

If as_attachment=True, the Content-Disposition header is set to attachment, which asks the browser to offer the file to the user as a download. Otherwise, a Content-Disposition header with a value of inline (the browser default) will be set only if a filename is available.

If open_file doesn’t have a name or if the name of open_file isn’t appropriate, provide a custom file name using the filename parameter. Note that if you pass a file-like object like io.BytesIO, it’s your task to seek() it before passing it to 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'))

The file will be closed automatically, so don’t open it with a context manager.

Методы

FileResponse.set_headers(open_file)

This method is automatically called during the response initialization and set various headers (Content-Length, Content-Type, and Content-Disposition) depending on open_file.