Сообщить об ошибке.

Функция send_from_directory() модуля flask в Python

Безопасно отправляет файл для загрузки клиенту

Синтаксис:

import flask

flask.send_from_directory(directory, path, **kwargs)

Параметры:

  • directory - каталог, в котором должен находиться путь path. Может быть строкой или os.PathLike объектом.
  • path - путь к файлу относительно каталога directory. Может быть строкой или os.PathLike объектом.
  • **kwargs - дополнительные ключевые аргументы для передачи в функцию send_file().

Внимание! В версии Flask 2.0 некоторые аргументы функций flask.send_from_directory() и flask.send_file() были переименованы. Удалены в версии Flask 2.2.0.

  • filename переименовывается в path.
  • attachment_filename переименовывается в download_name.
  • cache_timeout переименовывается в max_age.
  • add_etags переименован в etag.

Возвращаемое значение:

  • строка, которая указывает путь к файлу.

Описание:

Функция send_from_directory() модуля flask безопасно отправляет файл path из каталога directory с помощью функции flask.send_file().

@app.route("/uploads/<path:name>")
def download_file(name):
    return send_from_directory(
        app.config['UPLOAD_FOLDER'], name, as_attachment=True
    )

Это безопасный способ обслуживания файлов из папки, например статических файлов или загрузок. Функция send_from_directory() использует flask.safe_join(), которая гарантирует, что путь, исходящий от клиента, не будет указывать за пределы указанного каталога.

Если окончательный путь не указывает на существующий файл, то возникает ошибка 404 NotFound.

Изменено в версии 2.0: имя аргумента filename изменен на path.

Новое в версии 2.0: реализация перенесена в модуль Werkzeug. Теперь функция представляет собой обертку для передачи некоторых специфичных для Flask аргументов.

Пример переопределения URL для иконки сайта favicon.ico.

Чтобы подчеркнуть индивидуальность сайта используются файлы иконок: favicon.ico, favicon.png, favicon.svg. Чтобы добавить иконку на сайт, необходимо указать до нее путь. Так как Flask отдает статику из определенной директории, то этот путь будет выглядеть как то так: /static/favicon.svg.

По каким то причинам такое поведение не устраивает и хочется изменить путь на корневой /favicon.svg. В решении проблемы поможет функция send_from_directory().

from flask import request, send_from_directory
from www import app

# назначаем новые маршруты
@app.route('/favicon.svg')
@app.route('/sitemap.xml')
def from_root_url():
    # получаем URL, т.е. имя файла из `@app.route()`, можно
    # определить несколько `@app.route()` для разных файлов)
    path = request.path[1:]
    # объединяем его с `app.static_folder` и возвращаем 
    # по новому URL, указанному в `@app.route()`
    return send_from_directory(app.static_folder, path)

Все просто.