Фреймворк 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()