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 аргументов.
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)
Все просто.