Django использует объекты ответа и запроса что бы передавать состояние в системе.
Когда запрашивает страница, Django создает объект HttpRequest, который содержит различные данные о запросе. Потом Django определяет и загружает необходимое представление и вызывает его передавая объект HttpRequest первым аргументом. Каждое представление должно вернуть объект HttpResponse.
Этот раздел описывает API объектов HttpRequest и HttpResponse.
Все атрибуты кроме session должны использоваться только для чтения.
До Django 1.4, HttpRequest.body назывался HttpRequest.raw_post_data.
Тело запроса HTTP в байтовой строке. Он полезен для обработки данных различными способами, а не только традиционной HTML формой: передача изображений, загрузка XML и др. Для обработки данных обычной форма, используйте HttpRequest.POST.
Вы так же можете читать с объекта HttpRequest используя интерфейс чтения с файла. Смотрите HttpRequest.read().
Содержит полный путь к запрашиваемой странице, не включая домен.
Например: "/music/bands/the_beatles/"
Для некоторых конфигурация сервера, часть URL-а после названия домена содержит префикс скрипта и “полезную” часть пути(path info portion) (это происходит, например, при использовании настройки django.root для mod_python с Apache). Атрибут path_info всегда содержит часть URL-а, которую использует Django, не зависимо от сервера . Использование этого атрибута вместо path сделает ваш код более надежным и независимым от настроек сервера.
Например, если django.root равен "/minfo", атрибут path может быть равен "/minfo/music/bands/the_beatles/" в то время как path_info будет равен "/music/bands/the_beatles/".
Строка отображающая метод HTTP запроса. Значение всегда будет в верхнем регистре. Например:
if request.method == 'GET':
do_something()
elif request.method == 'POST':
do_something_else()
Кодировка, которая используется для декодирования данных формы (или None, что означает использовать значение настройки DEFAULT_CHARSET). Вы можете изменить значение этого атрибута. При последующих доступах к атрибутам (например, чтение с GET или POST) будет использоваться новое значение encoding. Полезен, если вы знаете, что данные формы не используют кодировку указанную DEFAULT_CHARSET.
Объект с интерфейсом словаря, который содержит HTTP GET параметры. Смотрите описание QueryDict ниже.
Объект с интерфейсом словаря, который содержит HTTP POST параметры. Смотрите описание QueryDict ниже.
Запрос может использовать метод POST но содержать пустой словарь POST – например, форма была передана через POST HTTP метод, но не содержала никаких данных. Поэтому, вы не должны использовать if request.POST для проверки был ли использован метод POST; вместо этого используйте if request.method == "POST" (смотрите ниже).
Заметим: POST не содержит информацию о загруженных файлах. Смотрите FILES.
Объект с интерфейсом словаря, который ищет данные сначала в POST, затем в GET. Сделан по примеру $_REQUEST в PHP.
Например, если GET = {"name": "john"} и POST = {"age": '34'}, REQUEST["name"] будет содержать "john", а REQUEST["age"] - "34".
Рекомендуется использовать GET и POST вместо REQUEST, поскольку последние являются более явными.
Словарь Python содержащий все “cookie”. Ключи и значения являются строками.
Объект с интерфейсом словаря, который содержит все загруженные файлы. Каждый ключ в FILES это name из <input type="file" name="" />. Каждое значение в FILES это объект UploadedFile описанный ниже.
Подробности в разделе Managing files.
Заметим, что FILES содержит данные только, если метод запроса POST и <form> содержал enctype="multipart/form-data". В другом случае FILES будет содержать пустой словарь.
Словарь Python содержащий все доступные HTTP заголовки запроса. Доступные заголовки зависят от сервера и клиента. Вот список возможных:
CONTENT_LENGTH – размер содержимого запроса (содержимое учитывается как строка).
CONTENT_TYPE – MIME-тип содержимого запроса.
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.
Содержит объект django.contrib.auth.models.User представляющий текущего “залогиненого” пользователя. Если пользователь не авторизирован, атрибут 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.
Атрибут user доступен только если проект использует AuthenticationMiddleware. Подробности смотрите в разделе Идентификация пользователей в Django.
Объект с интерфейсом словаря, который доступен для чтения и изменений, представляет текущую сессию. Доступен только, если настроена поддержка сессии. Подробности смотрите в разделе про использование сессии.
Не определяется Django, но будет использован если другой код (например, собственный функциональный слой(middleware)) установит его. Если определен, значение будет использоваться как URLconf текущего запроса вместо значения настройки ROOT_URLCONF. Подробности смотрите в разделе Как Django обрабатывает запрос.
Возвращает оригинальное имя хоста используя информацию из 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(object):
FORWARDED_FOR_FIELDS = [
'HTTP_X_FORWARDED_FOR',
'HTTP_X_FORWARDED_HOST',
'HTTP_X_FORWARDED_SERVER',
]
def process_request(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()
Этот функциональный слой должен находиться перед любый другим, который может использовать get_host(), например, CommonMiddleware или CsrfViewMiddleware.
Возвращает path, со строкой запроса, если она присутствует.
Например: "/music/bands/the_beatles/?print=true"
Возвращает абсолютный URI для аргумента location. Если location не указан, будет использовано значение request.get_full_path().
Если location уже является абсолютным URI, значение останется не измененным. В другом случае абсолютный URI будет создан с использованием данных запроса.
Например: "http://example.com/music/bands/the_beatles/?print=true"
Возвращает значение подписанных(signed) cookie, или вызывает исключение 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('non-existing-cookie')
...
KeyError: 'non-existing-cookie'
>>> request.get_signed_cookie('non-existing-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
Подробности смотрите в разделе о криптографической подписи.
Возвращает True если запрос безопасный; то есть, если он был выполнен через HTTPS.
Возвращает True, если запрос был выполнен через XMLHttpRequest, проверяя равен ли заголовок HTTP_X_REQUESTED_WITH значению 'XMLHttpRequest'. Большинство современных JavaScript библиотек используют этот заголовок. Если вы самостоятельно выполняете XMLHttpRequest запрос (в браузере), необходимо установить этот заголовок, иначе метод is_ajax() не будет работать.
Методы предоставляющие интерфейс файла для чтения данных из объекта HttpRequest. Это дает возможность читать содержимое запроса в потоке. Один из вариантов использования – это обработка большого XML-документа “парсером”, без создания всего XML-дерева в памяти.
Предоставляя стандартный интерфейс, объект HttpRequest можно передавать непосредственно в XML-“парсер” такой как ElementTree:
import xml.etree.ElementTree as ET
for element in ET.iterparse(request):
process(element)
В объекте HttpRequest, атрибуты GET и POST являются экземплярами класса django.http.QueryDict. QueryDict – это класс с интерфейсом словаря, который дополнительной хранить несколько значений для одного ключа. Это необходимо так как определенные элементы HTML-форм(например, <select multiple="multiple">) передают несколько значений для одного ключа.
Экземпляр QueryDict неизменяемый, если только вы не создадите его копию используя copy(). Это означает, что вы не можете непосредственно изменить атрибуты request.POST и request.GET.
Класс QueryDict представляет все стандартные методы словаря, так как является его подклассом. Исключения описаны здесь:
Возвращает значение для переданного ключа. Если ключа содержит несколько значений, __getitem__() возвращает последнее значение. Вызывает исключение django.utils.datastructures.MultiValueDictKeyError если ключ не существует. (Это подкласс стандартного исключения Python KeyError, так что вы как обычно можете обрабатывать исключение KeyError.)
Устанавливает значения ключа в [value] (список Python с единственным элементом value). Заметим, что этот метод, так же как и другие методы словаря изменяющие значения, могут быть вызваны только для изменяемого объекта QueryDict (который был создан через copy()).
Возвращает True если переданный ключ существует. Это позволяет вам использовать if "foo" in request.GET.
Аналогичен методу __getitem__(), но возвращает значение по-умолчанию вместо исключения, если ключ не существует.
Аналогичен методу setdefault() словаря, но использует метод __setitem__().
Принимает QueryDict или обычный словарь. Аналогичен методу update() словаря, но добавляет значения к текущему словарю, а не заменяет их. Например:
>>> q = QueryDict('a=1')
>>> q = q.copy() # to make it mutable
>>> q.update({'a': '2'})
>>> q.getlist('a')
[u'1', u'2']
>>> q['a'] # returns the last
[u'2']
Аналогичен методу items() словаря, но получает значения аналогично методу __getitem__(). Например:
>>> q = QueryDict('a=1&a=2&a=3')
>>> q.items()
[(u'a', u'3')]
Аналогичен методу iteritems() словаря. Как и метод QueryDict.items(), получает значения способом описанным в QueryDict.__getitem__().
Аналогичен методу QueryDict.iteritems(), но возвращает все значения, списком, для ключа.
Аналогичен методу values() словаря, но получает данные аналогично методу __getitem__(). Например:
>>> q = QueryDict('a=1&a=2&a=3')
>>> q.values()
[u'3']
Аналогичен методу QueryDict.values(), но является генератором.
В дополнение, QueryDict содержит такие методы:
Возвращает копию объекта, используя copy.deepcopy() из стандартных библиотек Python. Копия будет изменяемая – то есть, вы можете изменять ее значения.
Возвращает данные для ключа в виде списка. Возвращает пустой список, если ключ не существует и не указанно значение по-умолчанию. Этот метод всегда возвращает список, если не указанно значение по-умолчанию.
Устанавливает значение ключа в список list_ (в отличии от __setitem__()).
Добавляет элемент во внутренний список значений ключа.
Аналогичен setdefault, но принимает список значений, а не одно значение.
Аналогичен методу items(), но включает все значения списком для каждого элемента словаря. Например:
>>> q = QueryDict('a=1&a=2&a=3')
>>> q.lists()
[(u'a', [u'1', u'2', u'3'])]
Возвращает dict-представление объекта QueryDict. Для каждой пары (ключ, список) в QueryDict, возвращаемый словарь будет содержать ключ и значение, значением будет последнее значение из списка аналогично методу QueryDict.__getitem__():
>>> q = QueryDict('a=1&a=3&a=5')
>>> q.dict()
{u'a': u'5'}
Возвращает строку данных в формате запроса. Например:
>>> 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/'
В отличии от объекта HttpRequest, который создается Django, объект HttpResponse создаете вы. Каждое представление должно создать и вернуть объект HttpResponse.
Класс HttpResponse находится в модуле django.http.
Типичное использование заключается в передаче содержимого страницы в виде строке в конструктор 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 как объект файла:
>>> response = HttpResponse()
>>> response.write("<p>Here's the text of the Web page.</p>")
>>> response.write("<p>Here's another paragraph.</p>")
Вы можете передать итератор в конструктор HttpResponse вместо строки. Если вы используете такой подход, следуйте нескольким правилам:
Итератор должен возвращать строки.
Если вы передали итератор в конструктор HttpResponse вы не можете использовать экземпляр HttpResponse как объект файла. Будет вызвано исключение Exception.
При установке или удалении заголовка в объекте ответа, рассматривайте его как словарь:
>>> response = HttpResponse()
>>> response['Cache-Control'] = 'no-cache'
>>> del response['Cache-Control']
Заметим, что в отличии от словаря, del не вызовет исключение KeyError если заголовок не определен.
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, но очень легко забыть синтаксис, поэтому мы добавили пример.
Строковое представление содержимого, закодированное с объекта Unicode при необходимости.
Код HTTP состояния ответа.
Создает экземпляр HttpResponse с переданным содержимым и MIME-типом. Для MIME-типа используется значение настройки DEFAULT_CONTENT_TYPE, равное по-умолчанию 'text/html'.
content должен быть строкой или итератором. Если это итератор, он должен возвращать строки, которые будут объединены для формирования содержимого ответа. Если это не итератор и не строка, значение будет конвертировано в строковое представление.
status – это Код HTTP состояния ответа.
content_type это название для mimetype. Исторически, это параметр включал только mimetype, но так как фактически используется как значение HTTP заголовка Content-Type, он может содержать кодировку ответа, что делает его больше чем просто MIME-тип. Если указан mimetype``(не ``None), будет использовано его значение. Иначе – значение content_type. Если оба аргумента не указанны, используется значение настройки DEFAULT_CONTENT_TYPE.
Устанавливает заголовок ответа. header и value должны быть строками.
Удаляет заголовок ответа. Не вызывает исключения, если заголовок не существует. Регистронезависимый.
Возвращает значение заголовка. Регистрозависимый.
Возвращает True или False в результате регистронезависимого поиска заголовка по указанному названию.
Была добавлена возможность использовать объект datetime.datetime для объекта expires, и автоматическое вычисление max_age в таком случае. Был добавлен аргумент httponly.
Значение по-умолчанию для httponly изменено с False на True.
Устанавливает cookie. Аргументы соответствуют аргументам для конструктора объекта Cookie.Morsel из стандартных библиотек Python.
max_age должен содержать количество секунд или None (по-умолчанию), если cookie должна существовать до закрытия браузера. Если expires не указан, он будет вычислен.
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 будут доступны только для текущего домена.
Используйте httponly=True, если хотите ограничит доступ клиентского JavaScript fк этим cookie.
HTTPOnly – это флаг добавляемый в HTTP заголовок Set-Cookie ответа. Он не является частью стандарта RFC 2109, и поддерживается не всеми браузерами. Однако, если он поддерживается, это может быть полезным для уменьшения риска, что клиентский скрипт получит доступа к защищенным данным cookie.
Аналогичен set_cookie(), но использует криптографическую подписаь перед установкой cookie. Используется вместе с методом HttpRequest.get_signed_cookie(). Вы можете использовать не обязательный аргумент salt для дополнительной защиты, но не забывайте добавлять его при вызове HttpRequest.get_signed_cookie().
Удаляет cookie. Не вызывает исключения, если cookie не существует.
Учитывая механизм работы cookie, значения path и domain должны быть такими же, какие использовались при вызове set_cookie() – в противном случае cookie могут быть не удалены.
Метод для соблюдения интерфейса объекта файла.
Метод для соблюдения интерфейса объекта файла.
Метод для соблюдения интерфейса объекта файла.
Django содержит несколько подклассов HttpResponse, которые представляют различные типы HTTP ответов. Как и HttpResponse, эти подклассы находятся в модуле django.http.
Конструктор принимает один аргумент – путь для перенаправления. Это может быть полный URL (например, 'http://www.yahoo.com/search/') или абсолютный путь без домена (например, '/search/'). Возвращает код HTTP состояния равный 302.
Аналогичен HttpResponseRedirect, но возвращает постоянное перенаправление (код HTTP состояния 301) вместо временного перенаправления (код состояния 302).
Конструктор не принимает аргументы. Используйте, что бы указать, что страница не изменилась с прошлого запроса пользователя (код состояния 304).
Аналогичен HttpResponse но использует код состояния 400.
Аналогичен HttpResponse но использует код состояния 404.
Аналогичен HttpResponse но использует код состояния 403.
Аналогичен HttpResponse, но использует код состояния 405. Принимает один обязательный аргумент: список разрешенных методов (например, ['GET', 'POST']).
Аналогичен HttpResponse но использует код состояния 410.
Аналогичен HttpResponse но использует код состояния 500.
Примечание
Если ваш подкласс HttpResponse содержит метод render, Django воспринимает его как аналог класса SimpleTemplateResponse. Метод render должен возвращать правильный объект ответа.
Mar 30, 2016