Django httpresponse вернуть файл

Обновлено: 06.07.2024

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

Атрибуты¶

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В предыдущих версиях установка urlconf=None вызывала ImproperlyConfigured .

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

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

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

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

Методы¶

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

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

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

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

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

Объект QueryDict¶

Методы¶

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

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

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

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

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

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

В предыдущих версиях query_string был обязательным параметром.

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

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

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

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

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

Принимает QueryDict или обычный словарь. Аналогичен методу update() словаря, но добавляет значения к текущему словарю, а не заменяет их. Например:

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

Аналогичен методу iteritems() словаря. Как и метод QueryDict.items() , получает значения способом описанным в QueryDict.__getitem__() .

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

Аналогичен методу values() словаря, но получает данные аналогично методу __getitem__() . Например:

Аналогичен методу QueryDict.values() , но является генератором.

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

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

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

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

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

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

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

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

Удаляет произвольный элемент словаря(т.к. не сохраняется порядок ключей) и возвращает кортеж содержащий ключ и список значений. Вызывает KeyError , если словарь не содержит элементов. Например:

Возвращает dict -представление объекта QueryDict . Для каждой пары (ключ, список) в QueryDict , возвращаемый словарь будет содержать ключ и значение, значением будет последнее значение из списка аналогично методу QueryDict.__getitem__() :

Возвращает строку данных в формате запроса. Например:

Используя аргумент safe , можно указать безопасные символы, которые не будут закодированы. Например:

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

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

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

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

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

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

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

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

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

Для этого используйте аргумент content_type и установите заголовок Content-Disposition . Например, вот так вы можете вернуть таблицу Microsoft Excel:

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

Атрибуты¶

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

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

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

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

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

Методы¶

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

Был добавлен параметр charset .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Объект JsonResponse¶

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

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

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

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

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

Был добавлен аргумент json_dumps_params .

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

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

Для этого передайте в safe значение False :

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

До 5-й редакции EcmaScript была возможность использовать уязвимость в конструкторе Array в JavaScript. Поэтому Django по умолчанию не позволяет передавать не словари в JsonResponse . Однако, большинство современных браузеров поддерживают EcmaScript 5, исключая эту атаку. Поэтому можно отключить эту предосторожность безопасности.

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

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

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

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

Принимает итератор строк.

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

Не содержит атрибут content . Вместо этого содержит атрибут streaming_content .

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

Атрибуты¶

Итератор строк, которые являются содержимым ответа.

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

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

Читайте также: