Django вернуть файл на скачивание
Этот документ описывает API доступа к файлам Django для файлов, например, загруженных пользователем. API нижнего уровня достаточно общие, чтобы вы могли использовать их для других целей. Если вы хотите работать со «статическими файлами» (JS, CSS и т.д.), смотрите Как управлять статическими файлами (например, изображениями, JavaScript, CSS) .
По умолчанию Django хранит файлы локально, используя параметры MEDIA_ROOT и MEDIA_URL . В примерах ниже предполагается, что вы используете эти настройки по умолчанию.
Однако Django предоставляет способы написания пользовательских file storage systems, которые позволяют вам полностью настроить, где и как Django хранит файлы. Вторая половина этого документа описывает, как работают эти системы хранения.
JsonResponse objects¶
class JsonResponse ( data , encoder = DjangoJSONEncoder , safe = True , json_dumps_params = None , ** kwargs )¶
Заголовок 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() при генерации ответа.
Django использует объекты ответа и запроса, чтобы передавать состояние в системе.
Атрибуты¶
Все атрибуты должны рассматриваться как неизменяемые, пока об обратном не будет сказано явно.
Содержит полный путь к запрашиваемой странице, не включая домен.
Для некоторых конфигурация сервера, часть URL-а после названия домена содержит префикс скрипта и “полезную” часть пути(path info portion). Атрибут path_info всегда содержит часть URL-а, которую использует Django, не зависимо от сервера . Использование этого атрибута вместо path сделает ваш код более надежным и независимым от настроек сервера.
Например, если WSGIScriptAlias равен "/minfo" , атрибут path может быть равен "/minfo/music/bands/the_beatles/" в то время как path_info будет равен "/music/bands/the_beatles/" .
Кодировка, которая используется для декодирования данных формы (или None , что означает использовать значение настройки DEFAULT_CHARSET ). Вы можете изменить значение этого атрибута. При последующих доступах к атрибутам (например, чтение с GET или POST ) будет использоваться новое значение encoding . Полезен, если вы знаете, что данные формы не используют кодировку указанную DEFAULT_CHARSET .
Запрос может использовать метод POST но содержать пустой словарь POST – например, форма была передана через POST HTTP метод, но не содержала никаких данных. Поэтому, вы не должны использовать if request.POST для проверки был ли использован метод POST; вместо этого используйте if request.method == "POST" (смотрите ниже).
Заметим: POST не содержит информацию о загруженных файлах. Смотрите FILES .
Словарь Python содержащий все “cookie”. Ключи и значения являются строками.
Объект с интерфейсом словаря, который содержит все загруженные файлы. Каждый ключ в FILES это name из . Каждое значение в FILES это объект UploadedFile .
Заметим, что FILES содержит данные только, если метод запроса POST и содержал enctype="multipart/form-data" . В другом случае FILES будет содержать пустой словарь.
CONTENT_LENGTH – размер содержимого запроса (содержимое учитывается как строка).
CONTENT_TYPE – MIME-тип содержимого запроса.
QUERY_STRING – Строка запроса, не обработанная.
REMOTE_ADDR – IP-адрес клиента.
REMOTE_HOST – имя хоста клиента.
REMOTE_USER – пользователь аутентифицированный Web-сервером, если определен.
REQUEST_METHOD – Метод запроса. Строка, например, "GET" или "POST" .
SERVER_NAME – имя хоста сервера.
SERVER_PORT – Порт сервера(строка).
Обратите внимание, runserver обрезает все заголовки с подчеркиванием в названии, по этому вы их не увидите в META . Это предотвращает подделку заголовков, которая возможна из-за преобразования дефисов в подчеркивания в названиях переменных окружения WSGI. Такое поведение совпадает с поведением Web-серверов, таких как Nginx и Apache 2.4+.
Экземпляр ResolverMatch представляющий запрошенный URL. Атрибут устанавливается при поиске подходящего URL-шаблона, это значит что middleware он не доступен т.к. они вызывается до обработки URL-а (в таком случае вместо process_request можно использовать process_view ).
Использование¶
Преобразование не словарей¶
Для этого передайте в safe значение False :
При safe=False будет вызвано исключение TypeError .
До 5-й редакции EcmaScript была возможность использовать уязвимость в конструкторе Array в JavaScript. Поэтому Django по умолчанию не позволяет передавать не словари в JsonResponse . Однако, большинство современных браузеров поддерживают EcmaScript 5, исключая эту атаку. Поэтому можно отключить эту предосторожность безопасности.
Переопределяем преобразователь в JSON¶
Чтобы использовать другой преобразователь в JSON, передайте его через аргумент encoder конструктора:
Архитектура Django создавалась для обработки быстрых запросов. Потоковые запросы держат рабочий процесс и подключение к БД до окончания обработки запроса. Это может негативно повлиять на производительность.
Сложные задачи следует выполнять вне цикла запрос-ответ и не злоупотреблять потоковыми ответами.
Принимает итератор строк.
Вы не можете обратиться к содержимому ответа кроме как проитерировав объект ответа. Это должно происходить после возвращения ответа клиенту.
Не содержит атрибут content . Вместо этого содержит атрибут streaming_content .
Вы не можете использовать методы объекта файла tell() или write() . Это вызовет исключение.
Атрибуты, которые устанавливаются промежуточным слоем(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 .
Добавляется SessionMiddleware : объект с интерфейсом словаря, который содержит текущую сессию.
Добавляется CurrentSiteMiddleware : экземпляр Site или RequestSite , который возвращается get_current_site() , отображает текущий сайт.
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:
Атрибуты, которые могут добавляться кодом приложения¶
Django не устанавливает эти атрибуты, но использует их, если ваше приложение установит их.
The url template tag will use its value as the current_app argument to reverse() .
Будет использоваться как URLconf текущего запроса вместо значения настройки ROOT_URLCONF . Подробности смотрите в разделе Как Django обрабатывает запрос .
urlconf можно установить в None , чтобы отменить какие-либо изменения, сделанные предыдущими промежуточными слоями, и снова использовать ROOT_URLCONF .
Методы¶
Метод get_host() вернет ошибку если сервер находится за несколькими proxy. Одно из решений – создать функциональный слой(middleware), который переопределить заголовки proxy таким образом:
Этот функциональный слой должен находиться перед любый другим, который может использовать get_host() , например, CommonMiddleware или CsrfViewMiddleware .
Возвращает path , со строкой запроса, если она присутствует.
Возвращает абсолютный URI для аргумента location . Если location не указан, будет использовано значение request.get_full_path() .
Если location уже является абсолютным URI, значение останется не измененным. В другом случае абсолютный URI будет создан с использованием данных запроса.
Возвращает значение подписанных(signed) cookie, или вызывает исключение django.core.signing.BadSignature если подпись не верна. При передаче аргумента default исключение не будет вызвано и функция вернет значение по-умолчанию.
Необязательный аргумент salt может быть использован для дополнительной защиты от ” brute force” атак. Если передан аргумент max_age , время подписи cookie будет проверяться, чтобы убедиться, что cookie не старше max_age секунд.
Хранение файлов¶
За кулисами Django делегирует решения о том, как и где хранить файлы, файловой системе хранения. Это объект, который на самом деле понимает такие вещи, как файловые системы, открытие и чтение файлов и т.д.
Файловое хранилище Django по умолчанию задается параметром DEFAULT_FILE_STORAGE ; если вы явно не указали систему хранения, будет использоваться именно она.
Подробности о встроенной системе хранения файлов по умолчанию смотрите ниже, а информацию о написании собственной системы хранения файлов - в разделе Как написать пользовательский класс хранения .
Использование вызываемого объекта¶
В качестве параметра storage для FileField или ImageField можно использовать вызываемый объект. Это позволяет изменять используемое хранилище во время выполнения, например, выбирать разные хранилища для разных сред.
Ваш callable будет оцениваться при загрузке классов ваших моделей и должен возвращать экземпляр Storage .
Какой из них не выполняет то, что вам нужно, статическое обслуживание файлов веб-сервера или django.views.static.serve ?
Вот что я использовал:
Мне нужен был режим «rb» в функции open(), иначе этот код испортил мои PDF-файлы. Это соответствует коду, используемому в django/views/static.py.
Спасибо! Я заменил urllib2.urlopen(url_path).read() на open(path) , чтобы разрешить сквозной просмотр, обслуживающий pdf с внешнего сайта: [1] url = "https://s3.amazonaws.com/bucketname/path-to-external-file.pdf" [2] import urllib2 [3] test_file = urllib2.urlopen(url).read() [4] response = HttpResponse(content=test_file) [5] response['Content-Type'] = 'application/pdf' [6] response['Content-Disposition'] = 'attachment; filename="%s.pdf"' % 'whatever' [7] return response
Лучший ответ Игнасио Васкес-Абрамса ниже, используя итератор для возврата файлов по частям, а не для загрузки полного файла в память.
Почему бы вам не использовать статические файлы Django внутри вашего представления?
В документах говорится: "Внимание. Это представление будет работать только в том случае, если DEBUG имеет значение True. Это потому, что это представление крайне неэффективно и, вероятно, небезопасно. Оно предназначено только для локальной разработки и никогда не должно использоваться в производстве».
Я просто хотел этого. большое спасибо. @PhilippZedler нет проблем, мы можем настроить эти файлы в процессе производства. Но для обслуживания статических файлов, таких как /manifest.json и /servicewoker.js, в процессе разработки, я думаю, это лучший способ.
Он позволяет обслуживать файлы только из статических папок в вашем проекте. Используйте (из django.views.static import serve) , а также добавьте в функцию аргумент document_root.
Обслуживание файлов непосредственно из представления происходит очень медленно. Если вы ищете нормальное обслуживание файлов, см. этот вопрос: Django обслуживает загружаемые файлы
Чтобы очень легко обслуживать файлы через представление (например, в целях отладки), продолжайте читать.
Вы можете использовать приведенный ниже код в своем представлении:
Примечание: в этой функции я возвращаю изображения, но вы можете вернуть любую вещь в зависимости от ваших потребностей и установить свой context_type
Вот самый простой и эффективный способ сделать это.
app / urls.py
Предупреждение: поместите шаблон URL в конец
Должно быть расточительно использовать django для обслуживания статического контента (не говоря уже о том, что он на несколько порядков медленнее).
Я бы предпочел преобразовать представление в обработчик контекста и использовать переменные в шаблонах, чтобы найти, какие блоки включить.
Это именно то, от чего я хочу уйти. Я уже включаю этот материал, в результате чего файлы css и js включены жестко закодированными в файл html, что предотвращает любую форму кэширования (поскольку считается, что страница в целом изменяется). Я хочу иметь возможность отправлять js и css, но поскольку эта доставка зависит от доступных плагинов моего приложения, мне нужно выполнить некоторую логику перед отправкой файла.
Вы имеете в виду предотвращение любой формы кэширования Django? Поскольку включение CSS и JS в шаблон жестко закодировано, это не помешает браузеру пользователя их кэшировать. Я не понимаю, в чем проблема. Похоже, у вас возникли проблемы с кэшированием всей страницы из-за динамических включений. Почему бы не кэшировать остальную часть страницы и позволить браузеру/вашему веб-серверу сделать все остальное (что в любом случае является его работой)?
Django использует объекты ответа и запроса, чтобы передавать состояние в системе.
Использование¶
Передача строки¶
Support for memoryview was added.
Но если вам необходимо добавлять содержимое постепенно, вы можете использовать объект response как объект файла:
Передача итератора¶
Установка заголовков¶
При установке или удалении заголовка в объекте ответа, рассматривайте его как словарь:
Заметим, что в отличии от словаря, del не вызовет исключение KeyError если заголовок не определен.
Для установки заголовков Cache-Control и Vary , лучше использовать функции patch_cache_control() и patch_vary_headers() из модуля django.utils.cache , так как эти поля могут содержать несколько значений, разделенных запятыми. Эти функции добавят новые значение не удаляя существующие.
Указываем браузеру воспринимать ответ как вложенный файл¶
Для этого используйте аргумент content_type и установите заголовок Content-Disposition . Например, вот так вы можете вернуть таблицу Microsoft Excel:
Заголовок Content-Disposition никак не относится к Django, но очень легко забыть синтаксис, поэтому мы добавили пример.
Объект QueryDict¶
QueryDict из request.POST и request.GET – неизменяемы. Чтобы получить изменяемую версию, используйте .copy() .
Атрибуты¶
A bytestring representing the content, encoded from a string if necessary.
Если reason_phrase не установлен явно, изменение status_code вне конструктора также изменит reason_phrase .
Unless explicitly set, reason_phrase is determined by the value of status_code .
Указывает middleware, что этот ответ потоковый и его нужно обрабатывать не так, как обычные запросы.
True , если ответ был закрыт.
Методы¶
Метод get_host() вернет ошибку если сервер находится за несколькими proxy. Одно из решений – создать функциональный слой(middleware), который переопределить заголовки proxy таким образом:
Этот функциональный слой должен находиться перед любый другим, который может использовать get_host() , например, CommonMiddleware или CsrfViewMiddleware .
Возвращает path , со строкой запроса, если она присутствует.
Возвращает абсолютный 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:
Возвращает значение подписанных(signed) cookie, или вызывает исключение django.core.signing.BadSignature если подпись не верна. При передаче аргумента default исключение не будет вызвано и функция вернет значение по-умолчанию.
Необязательный аргумент salt может быть использован для дополнительной защиты от » brute force» атак. Если передан аргумент max_age , время подписи cookie будет проверяться, чтобы убедиться, что cookie не старше max_age секунд.
Подробности смотрите в разделе о криптографической подписи .
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.
Решение
Рыжий Лис, значит отдельный класс надо создавать, а потом уже из этого класса вытягивать?
Добавлено через 3 минуты
Только проблема то остаётся. Файл, который он скачивает сразу пишет "Файл не найден".
Добавлено через 17 секунд
Точнее файлы отсутствуют.
Добавлено через 7 минут
В том-то и проблема, что файл он находит, при скачке пишет как он называет и сразу: Ошибка: "Файлы отсутствуют", но он там есть))
Добавлено через 17 минут
Возможно проблема в том, что файлы добавляются вместе с новостью, то есть, я захожу в админку, создаю новую запись, там к записи добавляю файл, НО теперь имя пути файла (который мы в шаблоне прописываем) не тот который мы указали в upload_to, а теперь туда добавляется url, на котором лежит данная новость и отсюда получается что файл добавляется в корневую папку сайта (например в static) а адрес url получается news/static/имя_файла. Поэтому и проблема возникает такая, но как её решить я не знаю(
Добавлено через 27 минут
У меня в models.py есть класс, в котором есть поле для добавления файла, чтобы создавая новость можно было и файл воткнуть. Может как-то по-другому это делается?
Атрибуты¶
Все атрибуты должны рассматриваться как неизменяемые, пока об обратном не будет сказано явно.
Содержит полный путь к запрашиваемой странице, не включая домен.
Для некоторых конфигурация сервера, часть URL-а после названия домена содержит префикс скрипта и «полезную» часть пути(path info portion). Атрибут path_info всегда содержит часть URL-а, которую использует Django, не зависимо от сервера . Использование этого атрибута вместо path сделает ваш код более надежным и независимым от настроек сервера.
Например, если WSGIScriptAlias равен "/minfo" , атрибут path может быть равен "/minfo/music/bands/the_beatles/" в то время как path_info будет равен "/music/bands/the_beatles/" .
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.
A string representing the MIME type of the request, parsed from the CONTENT_TYPE header.
A dictionary of key/value parameters included in the CONTENT_TYPE header.
POST does not include file-upload information. See FILES .
A dictionary-like object containing all uploaded files. Each key in FILES is the name from the . Each value in FILES is an UploadedFile .
FILES will only contain data if the request method was POST and the that posted to the request had enctype="multipart/form-data" . Otherwise, FILES will be a blank dictionary-like object.
- 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 – Порт сервера(строка).
Обратите внимание, runserver обрезает все заголовки с подчеркиванием в названии, по этому вы их не увидите в META . Это предотвращает подделку заголовков, которая возможна из-за преобразования дефисов в подчеркивания в названиях переменных окружения WSGI. Такое поведение совпадает с поведением Web-серверов, таких как Nginx и Apache 2.4+.
The name of each header is stylized with title-casing (e.g. User-Agent ) when it’s displayed. You can access headers case-insensitively:
For use in, for example, Django templates, headers can also be looked up using underscores in place of hyphens:
Support for lookups using underscores was added.
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).
Методы¶
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 не существует.
Учитывая механизм работы cookie, значения path и domain должны быть такими же, какие использовались при вызове set_cookie() – в противном случае cookie могут быть не удалены.
Метод для соблюдения интерфейса объекта файла.
Метод для соблюдения интерфейса объекта файла.
Метод для соблюдения интерфейса объекта файла.
Этот атрибут, доступный только для чтения, содержит URL для редиректа (аналог заголовка Location ).
Конструктор не принимает аргументы и ответ должен быть пустым. Используйте, чтобы указать, что страница не изменилась с прошлого запроса пользователя (код состояния 304).
Атрибуты, которые могут добавляться кодом приложения¶
Django не устанавливает эти атрибуты, но использует их, если ваше приложение установит их.
Шаблонный тег url будет использовать значение этого атрибута как аргумент current_app для reverse() .
Будет использоваться как URLconf текущего запроса вместо значения настройки ROOT_URLCONF . Подробности смотрите в разделе Как Django обрабатывает запрос .
urlconf можно установить в None , чтобы отменить какие-либо изменения, сделанные предыдущими промежуточными слоями, и снова использовать ROOT_URLCONF .
В предыдущих версиях установка urlconf=None вызывала ImproperlyConfigured .
Использование¶
Передача строки¶
Но если вам необходимо добавлять содержимое постепенно, вы можете использовать объект response как объект файла:
Передача итератора¶
Установка заголовков¶
При установке или удалении заголовка в объекте ответа, рассматривайте его как словарь:
Заметим, что в отличии от словаря, del не вызовет исключение KeyError если заголовок не определен.
Для установки заголовков Cache-Control и Vary , лучше использовать функции patch_cache_control() и patch_vary_headers() из модуля django.utils.cache , так как эти поля могут содержать несколько значений, разделенных запятыми. Эти функции добавят новые значение не удаляя существующие.
Указываем браузеру воспринимать ответ как вложенный файл¶
Для этого используйте аргумент content_type и установите заголовок Content-Disposition . Например, вот так вы можете вернуть таблицу Microsoft Excel:
Заголовок Content-Disposition никак не относится к Django, но очень легко забыть синтаксис, поэтому мы добавили пример.
Объекты FileResponse¶
День добрый. Изучаю Django и наткнулся на проблему. У меня есть статьи, к этим статьям прикрепляются файлы (например картинка какая-то), под статьёй есть кнопка скачать. Вопрос: как другому пользователю скачать эту картинку, 4 часа блин бьюсь головой об клаву не могу понять, посмотрел интернет, там какая-то чушь! Помогите пожалуйста. Проблема в том, что при нажатии на кнопку скачать, оно типо качает, но пишет: "Файлы отсутствуют".
Скачивание
Поискал в поиске вродиб не че подобного нет. Вопрос как в сишарпе организовать скачивание файла с.
Скачивание
Привет всем, появилась проблема скачивания антивирусных баз для МОЕГО антивируса (я пишу.
Скачивание файла
Всем добрый день! Появилась такая проблема: необходимо скачать текстовый файл с сервера.
Скачивание файла
Здравствуйте при скачивании файла в браузере Опера появляется форма с возможностью выбора куда.
Статьи у меня не скачиваются, они выводятся.
Добавлено через 8 минут
Уже весь интернет перерыл, а там только загрузка на сайт и вывод на экран! А скачать то как блинаааааа.
Добавлено через 11 секунд
Уже весь интернет перерыл, а там только загрузка на сайт и вывод на экран! А скачать то как блинаааааа.
Картинка сама не выводится, но она есть, просто есть кнопка "скачать".
Добавлено через 7 минут
Выглядит так:
Текст: я затупок
m0nte-cr1st0, я так и делаю, но у меня при нажатии на ссылку открывается страница якобы не прописаны urls
Добавлено через 13 минут
Пишу вот так:
И меня выкидывает в urls.
Добавлено через 3 минуты
Я так понимаю, что надо прописывать функцию скачивания и обращаться не к имени файла в models, а к функции которая будет подттягивать нужный файл.
Добавлено через 12 секунд
Только вот, как это реализовать?
Добавлено через 19 минут
И я заметил, что при нажатии на ссылку скачки в браузере ссылка такая:
localhost/news/news/static/files/имя_файла
файл лежит по адресу:
То бишь news - 2 раза повторяются.
Добавлено через 3 минуты
Второй день бьюсь и никак не добьюсь блин.
Проблема в том, что в файл добавляется в Админ панели и сразу кладется в папку, нет смысла писать функцию скачивания если это просто ссылка, проблема перехода браузера к файлу, он подтягивает news/news/ а должен просто news
Добавлено через 14 минут
Смотрите как получается, в файле models.py я прописал поля для нашей записи, одно из полей это:
Таким образом при создании статьи мы ещё и добавляем файл к этой статье. Получается файл лежит my_site/static/1.jpg (например), но когда уже я жму на ссылку, он естественно перекидывает меня на my_site/news/static/1.jpg, ведь добавлял я файл в админке, а значит будет и путь news, вот в чём проблема, и поэтому я не могу его скачать когда добавляю:
Ведь в переменной articles.geeks_field - хранится путь my_site/news/static/1.jpg
Добавлено через 21 минуту
Итак друзья, случилось страшное, я добился того, чтобы скачивать файл, но вот незадача, теперь мне пишет: Ошибка: файлы отсутствуют.
Типо показано, как качается файл, но файл отсутствует.
Класс хранения встроенной файловой системы¶
Django поставляется с классом django.core.files.storage.FileSystemStorage , который реализует базовое хранение файлов локальной файловой системы.
Например, следующий код будет хранить загруженные файлы под /media/photos независимо от того, какова ваша настройка MEDIA_ROOT :
Custom storage systems работают одинаково: вы можете передать их в качестве аргумента storage в FileField .
Объекты хранения¶
Хотя в большинстве случаев вы захотите использовать объект File (который делегирует полномочия на соответствующее хранилище для данного файла), вы можете использовать системы хранения файлов напрямую. Вы можете создать экземпляр какого-либо пользовательского класса файлового хранилища, или - что часто более полезно - вы можете использовать глобальную систему хранения по умолчанию:
См. API для хранения файлов для API хранения файлов.
Объект JsonResponse¶
Заголовок 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() при генерации ответа.
Был добавлен аргумент json_dumps_params .
Методы¶
Класс 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 .)
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)¶
Принимает QueryDict или обычный словарь. Аналогичен методу update() словаря, но добавляет значения к текущему словарю, а не заменяет их. Например:
Аналогичен методу items() словаря, но получает значения аналогично методу __getitem__() . Например:
Аналогичен методу iteritems() словаря. Как и метод QueryDict.items() , получает значения способом описанным в QueryDict.__getitem__() .
Аналогичен методу QueryDict.iteritems() , но возвращает все значения, списком, для ключа.
Аналогичен методу values() словаря, но получает данные аналогично методу __getitem__() . Например:
Аналогичен методу QueryDict.values() , но является генератором.
В дополнение, QueryDict содержит такие методы:
Возвращает копию объекта, используя copy.deepcopy() из стандартных библиотек Python. Копия будет изменяемая, даже если оригинал не был.
QueryDict. getlist (key, default=None)¶
Возвращает данные для ключа в виде списка. Возвращает пустой список, если ключ не существует и не указанно значение по-умолчанию. Этот метод всегда возвращает список, если не указанно значение по-умолчанию другого типа.
QueryDict. setlist (key, list_)¶
Устанавливает значение ключа в список list_ (в отличии от __setitem__() ).
QueryDict. appendlist (key, item)¶
Добавляет элемент во внутренний список значений ключа.
QueryDict. setlistdefault (key, default_list=None)¶
Аналогичен setdefault , но принимает список значений, а не одно значение.
Аналогичен методу items() , но включает все значения списком для каждого элемента словаря. Например:
Возвращает список значений для переданного ключа и удаляет его из словаря. Вызывает KeyError , если ключ не существует. Например:
Удаляет произвольный элемент словаря(т.к. не сохраняется порядок ключей) и возвращает кортеж содержащий ключ и список значений. Вызывает KeyError , если словарь не содержит элементов. Например:
Возвращает dict -представление объекта QueryDict . Для каждой пары (ключ, список) в QueryDict , возвращаемый словарь будет содержать ключ и значение, значением будет последнее значение из списка аналогично методу QueryDict.__getitem__() :
Возвращает строку данных в формате запроса. Например:
Используя аргумент safe , можно указать безопасные символы, которые не будут закодированы. Например:
Методы¶
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.
Support for memoryview content was added.
Устанавливает заголовок ответа. 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 будет вычислено.
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.
Удаляет cookie. Не вызывает исключения, если cookie не существует.
Учитывая механизм работы cookie, значения path и domain должны быть такими же, какие использовались при вызове set_cookie() – в противном случае cookie могут быть не удалены.
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.
Метод для соблюдения интерфейса объекта файла.
Метод для соблюдения интерфейса объекта файла.
Метод для соблюдения интерфейса объекта файла.
Этот атрибут, доступный только для чтения, содержит URL для редиректа (аналог заголовка Location ).
Конструктор не принимает аргументы и ответ должен быть пустым. Используйте, чтобы указать, что страница не изменилась с прошлого запроса пользователя (код состояния 304).
Custom response classes¶
Объект File ¶
Внутри Django использует экземпляр django.core.files.File каждый раз, когда ему нужно представить файл.
В большинстве случаев вы будете использовать File , который предоставил вам Django (например, файл, прикрепленный к модели, как описано выше, или, возможно, загруженный файл).
Если вам нужно сконструировать File самостоятельно, самый простой способ - создать его с помощью встроенного в Python объекта file :
Теперь вы можете использовать любые документированные атрибуты и методы класса File .
Имейте в виду, что файлы, созданные таким образом, не закрываются автоматически. Для автоматического закрытия файлов можно использовать следующий подход:
Закрытие файлов особенно важно при обращении к полям файлов в цикле по большому количеству объектов. Если файлы не закрываются вручную после обращения к ним, может возникнуть риск исчерпания файловых дескрипторов. Это может привести к следующей ошибке:
Атрибуты, которые устанавливаются промежуточным слоем(middleware)¶
Некоторые промежуточные слои, включая встроенные в Django, добавляют атрибуты к объекту запроса. Если вы не нашли атрибут в объекте запроса, убедитесь, что нужный промежуточный слой добавлен в MIDDLEWARE_CLASSES .
Добавляется SessionMiddleware : объект с интерфейсом словаря, который содержит текущую сессию.
Добавляется CurrentSiteMiddleware : экземпляр Site или RequestSite , который возвращается get_current_site() , отображает текущий сайт.
Добавляется AuthenticationMiddleware : содержит объект AUTH_USER_MODEL представляющий текущего пользователя. Если пользователь не авторизирован, атрибут user будет содержать django.contrib.auth.models.AnonymousUser . Вы можете различить их используя is_authenticated() :
QueryDict objects¶
The QueryDict s 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() .
Атрибуты¶
Байтовое представление содержимого, закодированное с объекта Unicode при необходимости.
Если reason_phrase не установлен явно, изменение status_code вне конструктора также изменит reason_phrase .
Если не указан явно, reason_phrase определяется из текущего значения status_code .
Указывает middleware, что этот ответ потоковый и его нужно обрабатывать не так, как обычные запросы.
True , если ответ был закрыт.
Использование файлов в моделях¶
Когда вы используете FileField или ImageField , Django предоставляет набор API, которые вы можете использовать для работы с этим файлом.
Рассмотрим следующую модель, использующую ImageField для хранения фотографии:
Любой экземпляр Car будет иметь атрибут photo , который можно использовать для получения подробной информации о прикрепленной фотографии:
Этот объект – car.photo в примере – является объектом File , что означает, что он имеет все методы и атрибуты, описанные ниже.
Файл сохраняется как часть сохранения модели в базе данных, поэтому фактическое имя файла, используемое на диске, не может быть определено до тех пор, пока модель не будет сохранена.
Например, вы можете изменить имя файла, установив name на путь относительно места хранения файла ( MEDIA_ROOT , если вы используете FileSystemStorage по умолчанию):
Пока атрибуты ImageField , не относящиеся к изображению, такие как height , width и size , доступны на экземпляре, базовые данные изображения не могут быть использованы без повторного открытия изображения. Например:
Атрибуты¶
Итератор строк, которые являются содержимым ответа.
Если reason_phrase не установлен явно, изменение status_code вне конструктора также изменит reason_phrase .
Если не указан явно, reason_phrase определяется из текущего значения status_code .
Методы¶
Класс 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__() .
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:
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:
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:
Like dict.values() , except this uses the same last-value logic as __getitem__() and returns an iterator instead of a view object. For example:
В дополнение, QueryDict содержит такие методы:
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.
Аналогичен методу items() , но включает все значения списком для каждого элемента словаря. Например:
Возвращает список значений для переданного ключа и удаляет его из словаря. Вызывает KeyError , если ключ не существует. Например:
Удаляет произвольный элемент словаря(т.к. не сохраняется порядок ключей) и возвращает кортеж содержащий ключ и список значений. Вызывает KeyError , если словарь не содержит элементов. Например:
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__() :
Returns a string of the data in query string format. For example:
Use the safe parameter to pass characters which don’t require encoding. For example:
Читайте также: