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

Папки экземпляров приложений на Flask в Python

Фреймворк Flask позволяет обращаться к путям, относительно директории веб-приложения напрямую (через Flask.root_path). К сожалению, это работает только в том случае, если веб-приложения не являются пакетами, а в случае пакета корневой путь app.root_path относится к содержимому самого пакета.

В Flask 0.8 был введен новый атрибут: Flask.instance_path. Этот атрибут относится к новой концепции, называемой "папка экземпляра". Это идеальное место для хранения вещей, которые изменяются во время выполнения, например кеш приложения и т.д. Так же здесь можно хранить различные конфигурации приложения.

Путь к папке экземпляра можно указать при создании веб-приложения Flask либо явно, либо позволить Flask автоматически определять папку экземпляра. Для явной настройки, используйте аргумент instance_path при создании экземпляра приложения:

app = Flask(__name__, instance_path='/path/to/instance/folder')

Помните, что этот путь должен быть абсолютным.

Если аргумент instance_path не указан, то используются следующие местоположения по умолчанию:

Для неустановленного модуля:

/myapp.py
/instance

Для неустановленного пакета:

/myapp
    /__init__.py
/instance

Для установленного модуля или пакета:

$PREFIX/lib/pythonX.Y/site-packages/myapp
$PREFIX/var/myapp-instance

$PREFIX - это префикс вашей установки Python. Это может быть /usr или путь к virtualenv. Для того, чтобы посмотреть, какой префикс установлен, выполните функцию sys.prefix.

Загрузка конфигурации из папки экземпляра приложения.

Так как объект Config обеспечивал загрузку файлов конфигурации из относительных имен файлов, разработчики Flask сделали возможным изменить загрузку через имена файлов относительно пути к экземпляру, если это необходимо. Поведение относительных путей в файлах конфигурации можно переключить с "относительно корня приложения" (по умолчанию) на "относительно папки экземпляра" с помощью аргумента instance_relative_config в конструкторе приложения Flask:

app = Flask(__name__, instance_relative_config=True)

Полный пример того, как настроить Flask для предварительной загрузки конфигурации из модуля, а затем переопределения конфигурации из файла в папке экземпляра, если он существует:

app = Flask(__name__, instance_relative_config=True)
app.config.from_object('yourapplication.default_settings')
app.config.from_pyfile('application.cfg', silent=True)

Путь к папке экземпляра можно найти через атрибут экземпляра приложения app.instance_path. Flask также предоставляет ссылку для открытия файла из папки экземпляра с помощью app.open_instance_resource().

Пример использования:

filename = os.path.join(app.instance_path, 'application.cfg')
with open(filename) as f:
    config = f.read()

# Или через `open_instance_resource`:
with app.open_instance_resource('application.cfg') as f:
    config = f.read()