Обработка конфигурации
Приложениям необходима какая-то конфигурация. Существуют различные параметры, которые вы можете изменить в зависимости от среды приложения, например, включить режим отладки, установить секретный ключ и другие такие специфичные для среды вещи.
Способ разработки Flask обычно требует, чтобы конфигурация была доступна при запуске приложения. Вы можете закодировать конфигурацию в коде, что для многих небольших приложений не так уж и плохо, но существуют лучшие способы.
Независимо от того, как вы загружаете свою конфигурацию, доступен объект конфигурации, который хранит загруженные значения конфигурации: атрибут config объекта Flask. Именно здесь Flask сам размещает определенные значения конфигурации, а также здесь расширения могут разместить свои значения конфигурации. Но здесь вы также можете разместить свою собственную конфигурацию.
Основы конфигурации
Атрибут config фактически является подклассом словаря и может быть изменен, как любой словарь:
app = Flask(__name__) app.config['TESTING'] = True
Некоторые значения конфигурации также передаются объекту Flask, чтобы вы могли читать и записывать их оттуда:
app.testing = True
Чтобы обновить несколько ключей одновременно, вы можете использовать метод dict.update():
app.config.update(
TESTING=True,
SECRET_KEY='192b9bdd22ab9ed4d12e236c78afcb9a393ec15f71bbf5dc987d54727823bcbf'
)
Режим отладки
Значение конфигурации DEBUG является специальным, потому что его поведение может быть непредсказуемым, если его изменить после того, как приложение начало настраиваться. Чтобы надежно установить режим отладки, используйте параметр --debug в команде flask или flask run. flask run будет по умолчанию использовать интерактивный отладчик и перезагрузчик в режиме отладки.
$ flask --app hello run --debug
Рекомендуется использовать этот параметр. Хотя можно установить DEBUG в вашей конфигурации или коде, это крайне не рекомендуется. Его нельзя прочитать на ранней стадии командой flask run, и некоторые системы или расширения могут уже настроиться на основе предыдущего значения.
Встроенные значения конфигурации
Следующие значения конфигурации используются внутри Flask:
-
DEBUG -
Включен ли режим отладки. При использовании
flask runдля запуска сервера разработки, при возникновении необработанных исключений будет показан интерактивный отладчик, а сервер будет перезагружен при изменении кода. Атрибутdebugсопоставляется с этим ключом конфигурации. Это устанавливается переменной средыFLASK_DEBUG. Возможно, он не будет работать как ожидается, если установлен в коде.Не включайте режим отладки при развертывании в рабочей среде.
Значение по умолчанию:
False
-
TESTING -
Включить тестовый режим. Исключения распространяются, а не обрабатываются обработчиками ошибок приложения. Расширения также могут изменить свое поведение для облегчения тестирования. Вы должны включить это в своих тестах.
Значение по умолчанию:
False
-
PROPAGATE_EXCEPTIONS -
Исключения повторно поднимаются, а не обрабатываются обработчиками ошибок приложения. Если не задано, это подразумевается как истинно, если включен
TESTINGилиDEBUG.Значение по умолчанию:
None
-
TRAP_HTTP_EXCEPTIONS -
Если для исключения типа
HTTPExceptionнет обработчика, он поднимается повторно для обработки интерактивным отладчиком вместо возврата простого ответа об ошибке.Значение по умолчанию:
False
-
TRAP_BAD_REQUEST_ERRORS -
Попытка получить несуществующий ключ из словарей запросов, таких как
argsиform, вернёт страницу ошибки 400 Bad Request. Включите это, чтобы рассматривать ошибку как необработанное исключение, чтобы получить интерактивный отладчик. Это более специфичная версияTRAP_HTTP_EXCEPTIONS. Если не установлено, оно включено в режиме отладки.Значение по умолчанию:
None
-
SECRET_KEY -
Секретный ключ, который будет использоваться для безопасного шифрования cookie сессии и может быть использован для других задач безопасности расширениями или вашим приложением. Он должен быть длинным случайным
bytesилиstr. Например, скопируйте вывод этого в свою конфигурацию:$ python -c 'import secrets; print(secrets.token_hex())' '192b9bdd22ab9ed4d12e236c78afcb9a393ec15f71bbf5dc987d54727823bcbf'
Не раскрывайте секретный ключ при публикации вопросов или коммитов кода.
Значение по умолчанию:
None
-
SECRET_KEY_FALLBACKS -
Список старых секретных ключей, которые все еще могут быть использованы для расшифровки, самый последний в списке — первый. Это позволяет проекту реализовать ротацию ключей без аннулирования активных сессий или других недавно зашифрованных секретов.
Ключи должны быть удалены после соответствующего периода времени, так как проверка каждого дополнительного ключа добавляет некоторую нагрузку.
Встроенная безопасная сессия cookie Flask поддерживает это. Расширения, использующие
SECRET_KEY, пока могут не поддерживать это.Значение по умолчанию:
NoneДобавлена в версии 3.1.
-
SESSION_COOKIE_NAME -
Имя cookie сессии. Можно изменить, если у вас уже есть cookie с таким же именем.
Значение по умолчанию:
'session'
-
SESSION_COOKIE_DOMAIN -
Значение параметра
Domainв cookie сессии. Если не задано, браузеры отправят cookie только на точный домен, с которого он был установлен. В противном случае они отправят его и на любые поддомены заданного значения.Не устанавливать это значение более ограничено и безопасно, чем установка.
Значение по умолчанию:
NoneПредупреждение
Если это изменится после того, как браузер создал cookie с другим значением, это может привести к созданию другого. Браузеры могут отправлять оба в неопределённом порядке. В этом случае вы можете изменить
SESSION_COOKIE_NAMEили каким-либо другим способом аннулировать старые сессии.Журнал изменений
Изменено в версии 2.3: Не установлено по умолчанию, не использует
SERVER_NAMEпо умолчанию.
-
SESSION_COOKIE_PATH -
Путь, для которого будет действовать cookie сессии. Если не задано, cookie будет действовать под
APPLICATION_ROOTили/, если это не установлено.Значение по умолчанию:
None
-
SESSION_COOKIE_HTTPONLY -
Браузеры не позволят JavaScript получать доступ к cookie, помеченным как «HTTP-only», для повышения безопасности.
Значение по умолчанию:
True
-
SESSION_COOKIE_SECURE -
Браузеры будут отправлять cookie только с запросами по HTTPS, если cookie помечен как «secure». Приложение должно быть доступно по HTTPS, для того чтобы это имело смысл.
Значение по умолчанию:
False
-
SESSION_COOKIE_PARTITIONED -
Браузеры будут отправлять cookie на основе домена верхнего уровня документа, а не только домена документа, устанавливающего cookie. Это предотвращает «утечку» cookie третьей стороны, установленных во фреймах, между различными сайтами.
Браузеры начинают отключать неразделенные cookie третьей стороны, поэтому необходимо помечать cookie как разделенные, если вы ожидаете их работоспособности в таких встроенных ситуациях.
Включение этого подразумевает также включение
SESSION_COOKIE_SECURE, так как оно работает только при доступе по HTTPS.Значение по умолчанию:
FalseДобавлена в версии 3.1.
-
SESSION_COOKIE_SAMESITE -
Ограничить, как cookie отправляются с запросами с внешних сайтов. Может быть установлено в
'Lax'(рекомендуется) или'Strict'. См. Параметры Set-Cookie.Значение по умолчанию:
NoneЖурнал изменений
Добавлена в версии 1.0.
-
PERMANENT_SESSION_LIFETIME -
Если
session.permanentимеет значение true, срок действия cookie будет установлен через это количество секунд в будущем. Может быть какdatetime.timedelta, так иint.Встроенная реализация cookie Flask проверяет, что криптографическая подпись не старше этого значения.
Значение по умолчанию:
timedelta(days=31)(2678400секунд)
-
SESSION_REFRESH_EACH_REQUEST -
Управлять отправкой cookie с каждым ответом, когда
session.permanentимеет значение true. Отправка cookie каждый раз (по умолчанию) более надёжно предотвращает истечение сессии, но использует больше пропускной способности. На непостоянные сессии это не влияет.Значение по умолчанию:
True
-
USE_X_SENDFILE -
При обслуживании файлов установить заголовок
X-Sendfileвместо отправки данных с Flask. Некоторые веб-серверы, такие как Apache, распознают это и обслуживают данные более эффективно. Это имеет смысл только при использовании такого сервера.Значение по умолчанию:
False
-
SEND_FILE_MAX_AGE_DEFAULT -
При обслуживании файлов установите максимальное время кэширования в секундах. Может быть
datetime.timedeltaилиint. Переопределите это значение для каждого файла с помощьюget_send_file_max_age()в приложении или шаблоне.Если
None,send_fileуказывает браузеру использовать условные запросы вместо кэша с определённым временем, что обычно предпочтительнее.Значение по умолчанию:
None
-
TRUSTED_HOSTS -
Проверить
Request.hostи другие атрибуты, которые используют его, на соответствие этим доверенным значениям. ВызовитеSecurityError, если хост недействителен, что приводит к ошибке 400. Если этоNone, все хосты действительны. Каждое значение совпадает точно или может начинаться с точки.для соответствия любому поддомену.Проверка выполняется во время маршрутизации по этому значению.
before_requestиafter_requestколбеки всё равно будут вызваны.Значение по умолчанию:
NoneДобавлена в версии 3.1.
-
SERVER_NAME -
Укажите приложению хост и порт, к которым оно привязано.
Должно быть установлено, если
subdomain_matchingвключено, чтобы можно было извлечь поддомен из запроса.Должно быть установлено для
url_forгенерации внешних URL-адресов за пределами контекста запроса.По умолчанию:
NoneИзменено в версии 3.1: Не ограничивает запросы только этим доменом для
subdomain_matchingиhost_matching.Изменения
Изменено в версии 2.3: Не влияет на
SESSION_COOKIE_DOMAIN.Изменено в версии 1.0: Не включает
subdomain_matchingнеявно.
-
APPLICATION_ROOT -
Укажите приложению путь, под которым оно смонтировано приложением/веб-сервером. Это используется для генерации URL-адресов за пределами контекста запроса (внутри запроса за настройку
SCRIPT_NAMEотвечает диспетчер; см. Отправка приложения для примеров конфигурации диспетчера).Будет использоваться для пути куки сессии, если
SESSION_COOKIE_PATHне задан.По умолчанию:
'/'
-
PREFERRED_URL_SCHEME -
Используйте эту схему для генерации внешних URL-адресов, когда вы не находитесь в контексте запроса.
По умолчанию:
'http'
-
MAX_CONTENT_LENGTH -
Максимальное количество байтов, которое будет считано во время этого запроса. Если этот предел превышен, возникает ошибка 413
RequestEntityTooLarge. Если значение установлено вNone, ограничение на уровне приложения Flask не применяется. Однако, если этоNone, запрос не имеет заголовкаContent-Length, а WSGI-сервер не указывает, что он завершает поток, то данные не считываются, чтобы избежать бесконечного потока.Каждый запрос по умолчанию использует эту конфигурацию. Ее можно установить для определённого
Request.max_content_length, чтобы применить ограничение к этому конкретному представлению. Значение должно быть установлено в соответствии со специфическими потребностями приложения или представления.По умолчанию:
NoneИзменения
Добавлен в версии 0.6.
-
MAX_FORM_MEMORY_SIZE -
Максимальный размер в байтах любого поля формы без файла в теле
multipart/form-data. Если этот предел превышен, возникает ошибка 413RequestEntityTooLarge. Если значение установлено вNone, ограничение на уровне приложения Flask не применяется.Каждый запрос по умолчанию использует эту конфигурацию. Ее можно установить для определённого
Request.max_form_memory_parts, чтобы применить ограничение к этому конкретному представлению. Значение должно быть установлено в соответствии со специфическими потребностями приложения или представления.По умолчанию:
500_000Добавлен в версии 3.1.
-
MAX_FORM_PARTS -
Максимальное количество полей, которые могут присутствовать в теле
multipart/form-data. Если этот предел превышен, возникает ошибка 413RequestEntityTooLarge. Если значение установлено вNone, ограничение на уровне приложения Flask не применяется.Каждый запрос по умолчанию использует эту конфигурацию. Ее можно установить для определённого
Request.max_form_parts, чтобы применить ограничение к этому конкретному представлению. Значение должно быть установлено в соответствии со специфическими потребностями приложения или представления.По умолчанию:
1_000Добавлен в версии 3.1.
-
TEMPLATES_AUTO_RELOAD -
Перезагружать шаблоны при их изменении. Если не установлено, будет включено в режиме отладки.
По умолчанию:
None
-
EXPLAIN_TEMPLATE_LOADING -
Вести журнал отладочной информации, отслеживая, как загружался файл шаблона. Это может быть полезно для выяснения причины, по которой шаблон не загрузился или загрузился неверный файл.
По умолчанию:
False
-
MAX_COOKIE_SIZE -
Выводить предупреждение, если заголовки cookie превышают это количество байтов. По умолчанию
4093. Крупные cookie могут быть проигнорированы браузерами. Установите в0для отключения предупреждения.
-
PROVIDE_AUTOMATIC_OPTIONS -
Установите в
Falseдля отключения автоматического добавления ответов OPTIONS. Это можно переопределить для каждого маршрута, изменив атрибутprovide_automatic_options.
Добавлен в версии 3.10: Добавлен PROVIDE_AUTOMATIC_OPTIONS для управления автоматическим добавлением сгенерированных ответов OPTIONS по умолчанию.
Изменения
Изменено в версии 2.3: JSON_AS_ASCII, JSON_SORT_KEYS, JSONIFY_MIMETYPE, и JSONIFY_PRETTYPRINT_REGULAR были удалены. У эквивалентных атрибутов есть эквиваленты в поставщике по умолчанию app.json.
Изменено в версии 2.3: ENV был удален.
Изменено в версии 2.2: Удален PRESERVE_CONTEXT_ON_EXCEPTION.
Изменено в версии 1.0: LOGGER_NAME и LOGGER_HANDLER_POLICY были удалены. См. Ведение журнала для информации о конфигурации.
Добавлен ENV для отражения переменной среды FLASK_ENV.
Добавлен SESSION_COOKIE_SAMESITE для управления опцией SameSite cookie сессии.
Добавлен MAX_COOKIE_SIZE для управления предупреждением из Werkzeug.
Добавлен в версии 0.11: SESSION_REFRESH_EACH_REQUEST, TEMPLATES_AUTO_RELOAD, LOGGER_HANDLER_POLICY, EXPLAIN_TEMPLATE_LOADING
Добавлен в версии 0.10: JSON_AS_ASCII, JSON_SORT_KEYS, JSONIFY_PRETTYPRINT_REGULAR
Добавлен в версии 0.9: PREFERRED_URL_SCHEME
Добавлен в версии 0.8: TRAP_BAD_REQUEST_ERRORS, TRAP_HTTP_EXCEPTIONS, APPLICATION_ROOT, SESSION_COOKIE_DOMAIN, SESSION_COOKIE_PATH, SESSION_COOKIE_HTTPONLY, SESSION_COOKIE_SECURE
Добавлен в версии 0.7: PROPAGATE_EXCEPTIONS, PRESERVE_CONTEXT_ON_EXCEPTION
Добавлен в версии 0.6: MAX_CONTENT_LENGTH
Добавлен в версии 0.5: SERVER_NAME
Добавлен в версии 0.4: LOGGER_NAME
Настройка из файлов Python
Настройка становится полезнее, если вы можете хранить ее в отдельном файле, предпочтительно расположенном вне собственно пакета приложения. Вы можете развернуть свое приложение, а затем настроить его отдельно для конкретного развертывания.
Обычный шаблон выглядит так:
app = Flask(__name__)
app.config.from_object('yourapplication.default_settings')
app.config.from_envvar('YOURAPPLICATION_SETTINGS')
Это сначала загружает конфигурацию из модуля yourapplication.default_settings , а затем переопределяет значения содержимым файла, на который указывает переменная среды YOURAPPLICATION_SETTINGS. Эту переменную среды можно задать в оболочке перед запуском сервера:
$ export YOURAPPLICATION_SETTINGS=/path/to/settings.cfg $ flask run * Running on http://127.0.0.1:5000/
$ set -x YOURAPPLICATION_SETTINGS /path/to/settings.cfg $ flask run * Running on http://127.0.0.1:5000/
> set YOURAPPLICATION_SETTINGS=\path\to\settings.cfg > flask run * Running on http://127.0.0.1:5000/
> $env:YOURAPPLICATION_SETTINGS = "\path\to\settings.cfg" > flask run * Running on http://127.0.0.1:5000/
Сами файлы конфигурации — это фактические файлы Python. Только значения, записанные в верхнем регистре, фактически сохраняются в объекте config позднее. Поэтому убедитесь, что для ваших ключей конфигурации используются заглавные буквы.
Вот пример файла конфигурации:
# Example configuration SECRET_KEY = '192b9bdd22ab9ed4d12e236c78afcb9a393ec15f71bbf5dc987d54727823bcbf'
Убедитесь, что вы загружаете конфигурацию очень рано, чтобы расширения могли получить доступ к конфигурации при запуске. В объекте config также есть другие методы для загрузки из отдельных файлов. Для полной справки прочитайте документацию объекта Config.
Настройка из файлов данных
Также можно загрузить конфигурацию из файла в формате по вашему выбору, используя from_file(). Например, для загрузки из файла TOML:
import tomllib
app.config.from_file("config.toml", load=tomllib.load, text=False)
Или из файла JSON:
import json
app.config.from_file("config.json", load=json.load)
Настройка из переменных среды
Помимо указания на файлы конфигурации с помощью переменных среды, вам может быть полезно (или необходимо) контролировать значения конфигурации непосредственно из среды. Flask можно настроить на загрузку всех переменных среды, начинающихся со специфического префикса, в конфигурацию с помощью from_prefixed_env().
Переменные среды можно установить в оболочке перед запуском сервера:
$ export FLASK_SECRET_KEY="5f352379324c22463451387a0aec5d2f" $ export FLASK_MAIL_ENABLED=false $ flask run * Running on http://127.0.0.1:5000/
$ set -x FLASK_SECRET_KEY "5f352379324c22463451387a0aec5d2f" $ set -x FLASK_MAIL_ENABLED false $ flask run * Running on http://127.0.0.1:5000/
> set FLASK_SECRET_KEY="5f352379324c22463451387a0aec5d2f" > set FLASK_MAIL_ENABLED=false > flask run * Running on http://127.0.0.1:5000/
> $env:FLASK_SECRET_KEY = "5f352379324c22463451387a0aec5d2f" > $env:FLASK_MAIL_ENABLED = "false" > flask run * Running on http://127.0.0.1:5000/
Затем переменные можно загрузить и получить доступ к ним через конфигурацию с ключом, равным имени переменной среды без префикса, т.е.
app.config.from_prefixed_env() app.config["SECRET_KEY"] # Is "5f352379324c22463451387a0aec5d2f"
Префикс по умолчанию FLASK_. Он настраивается через аргумент prefix метода from_prefixed_env().
Значения будут анализироваться для попытки преобразования их в тип, более специфичный, чем строки. По умолчанию используется json.loads(), поэтому возможны любые допустимые значения JSON, включая списки и словари. Это настраивается через аргумент loads метода from_prefixed_env().
При добавлении логического значения с помощью анализа JSON по умолчанию допустимыми значениями являются только «true» и «false», в нижнем регистре. Имейте в виду, что любая непустая строка считается True в Python.
Можно задавать ключи вложенных словарей, разделяя ключи двойным подчеркиванием (__). Любые промежуточные ключи, которых нет в родительском словаре, будут инициализированы пустым словарем.
$ export FLASK_MYAPI__credentials__username=user123
app.config["MYAPI"]["credentials"]["username"] # Is "user123"
В Windows ключи переменных среды всегда записываются в верхнем регистре, поэтому приведенный выше пример приведёт к MYAPI__CREDENTIALS__USERNAME.
Для ещё более широких возможностей загрузки конфигурации, включая слияние и поддержку регистронезависимых ключей в Windows, попробуйте специализированную библиотеку, такую как Dynaconf, которая включает интеграцию с Flask.
Рекомендации по настройке
Недостатком подхода, упомянутого ранее, является то, что он немного усложняет тестирование. В общем случае нет единственного 100%-ного решения этой проблемы, но есть несколько моментов, которые следует учитывать для улучшения этого опыта:
- Создайте своё приложение в функции и регистрируйте шаблоны в нём. Таким образом, вы можете создавать несколько экземпляров своего приложения с различными прикреплёнными конфигурациями, что значительно упрощает тестирование. Вы можете использовать это для передачи конфигурации по мере необходимости.
- Не пишите код, которому требуется конфигурация во время импорта. Если ограничиться только доступом к конфигурации во время запросов, вы можете переконфигурировать объект по мере необходимости.
- Убедитесь, что вы загружаете конфигурацию на очень ранней стадии, чтобы расширения могли получить доступ к конфигурации при вызове
init_app.
Разработка/Производство
Большинству приложений требуется более одной конфигурации. Должны быть по меньшей мере отдельные конфигурации для сервера производства и для сервера, используемого во время разработки. Самый простой способ справиться с этим — использовать стандартную конфигурацию, которая всегда загружается и является частью контроля версий, и отдельную конфигурацию, которая переопределяет значения по мере необходимости, как показано в примере выше:
app = Flask(__name__)
app.config.from_object('yourapplication.default_settings')
app.config.from_envvar('YOURAPPLICATION_SETTINGS')
Затем вам нужно просто добавить отдельный config.py файл и экспортировать YOURAPPLICATION_SETTINGS=/path/to/config.py и всё готово. Однако есть и альтернативные способы. Например, вы можете использовать импорты или наследование.
Что очень популярно в Django, так это явное указание импорта в файле конфигурации, добавив from yourapplication.default_settings
import * в начало файла, а затем вручную переопределяя изменения. Вы также можете проверить переменную среды, например YOURAPPLICATION_MODE , и установить её значение на production, development и т.д., и импортировать разные жёстко закодированные файлы на основе этого.
Ещё один интересный способ — использовать классы и наследование для конфигурации:
class Config(object):
TESTING = False
class ProductionConfig(Config):
DATABASE_URI = 'mysql://user@localhost/foo'
class DevelopmentConfig(Config):
DATABASE_URI = "sqlite:////tmp/foo.db"
class TestingConfig(Config):
DATABASE_URI = 'sqlite:///:memory:'
TESTING = True
Чтобы включить такую конфигурацию, нужно просто вызвать from_object():
app.config.from_object('configmodule.ProductionConfig')
Обратите внимание, что from_object() не создаёт экземпляр объекта класса. Если вам нужно создать экземпляр класса, например, для доступа к свойству, то нужно сделать это до вызова from_object():
from configmodule import ProductionConfig
app.config.from_object(ProductionConfig())
# Alternatively, import via string:
from werkzeug.utils import import_string
cfg = import_string('configmodule.ProductionConfig')()
app.config.from_object(cfg)
Создание экземпляра объекта конфигурации позволяет использовать @property в ваших классах конфигурации:
class Config(object):
"""Base config, uses staging database server."""
TESTING = False
DB_SERVER = '192.168.1.56'
@property
def DATABASE_URI(self): # Note: all caps
return f"mysql://user@{self.DB_SERVER}/foo"
class ProductionConfig(Config):
"""Uses production database server."""
DB_SERVER = '192.168.19.32'
class DevelopmentConfig(Config):
DB_SERVER = 'localhost'
class TestingConfig(Config):
DB_SERVER = 'localhost'
DATABASE_URI = 'sqlite:///:memory:'
Существует множество различных способов, и как вы хотите управлять своими файлами конфигурации — решать вам. Однако вот список хороших рекомендаций:
- Храните стандартную конфигурацию в системе контроля версий. Либо заполните конфигурацию этим стандартным значением, либо импортируйте его в свои собственные файлы конфигурации перед переопределением значений.
- Используйте переменную среды для переключения между конфигурациями. Это можно сделать вне интерпретатора Python и значительно упрощает разработку и развертывание, потому что вы быстро и легко можете переключаться между различными конфигурациями, не изменяя код. Если вы часто работаете над разными проектами, вы можете даже создать свою собственную скриптовую утилиту для запуска виртуальной среды и экспорта вашей конфигурации разработки.
- Используйте инструмент, подобный fabric, для одновременной загрузки кода и конфигурации на сервер(ы) производства.
Папки экземпляров
Журнал изменений
Добавлен в версии 0.8.
Flask 0.8 представляет папки экземпляров. Flask долгое время позволял ссылаться на пути относительно папки приложения напрямую (через Flask.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для просмотра установленного префикса.
Поскольку объект конфигурации позволял загружать конфигурационные файлы из относительных имен файлов, мы добавили возможность изменять загрузку по именам файлов, относительно пути экземпляра, если это требуется. Поведение относительных путей в конфигурационных файлах может быть переключено между «относительно корня приложения» (по умолчанию) и «относительно папки экземпляра» с помощью переключателя instance_relative_config в конструкторе приложения:
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)
Путь к папке экземпляра можно найти через Flask.instance_path. Flask также предоставляет ярлык для открытия файла из папки экземпляра с помощью Flask.open_instance_resource().
Пример использования обоих методов:
filename = os.path.join(app.instance_path, 'application.cfg')
with open(filename) as f:
config = f.read()
# or via open_instance_resource:
with app.open_instance_resource('application.cfg') as f:
config = f.read()
© 2010 Pallets
Licensed under the BSD 3-clause License.
https://flask.palletsprojects.com/en/stable/config/