TATECHATLAS
◎ Русский
Программирование

Проверка настроек среды Python перед запуском приложения

Отличайте отсутствующие и пустые настройки, явно разбирайте порты и булевы значения, и сообщайте об ошибках конфигурации, не обнажая секреты.

В этом материале

Считывайте настройки среды как строки, проверяйте их один раз перед началом работы приложения и преобразуйте каждую настройку согласно явному контракту. Отсутствующее значение, пустое значение и недопустимое значение могут требовать разных реакций. Ни os.getenv, ни configparser не выбирают порядок приоритетов конфигурации приложения и не загружают файл .env автоматически.

Разбирайте порт согласно объявленному контракту

Следующий пример из стандартной библиотеки принимает строку или None. Он использует int для преобразования десятичного целого числа и проверяет включенный диапазон от 1 до 65535. Фиксированные сообщения идентифицируют проблему, не повторяя переданное значение. Проверка диапазона не доказывает, что порт доступен или что процесс имеет право на привязку.

Разделяйте отсутствующую настройку и пустую

Без аргумента по умолчанию os.getenv("PORT") возвращает None, когда PORT отсутствует. Если переменная существует с пустым значением, возвращается пустая строка. Проверяйте эти состояния отдельно, когда у них разное значение. Например, отсутствующий необязательный порт может использовать значение по умолчанию, а явно пустая обязательная настройка должна приводить к ошибке конфигурации.

Не выбирайте значение по умолчанию через raw или default_value, если такая политика не предназначена намеренно для обработки всех пустых строк как отсутствующих. Считайте настройку один раз во локальную переменную, чтобы парсинг, сообщение об ошибке и последующий запуск приложения использовали одно и то же значение.

def parse_port(raw):
    if raw is None:
        raise ValueError("PORT is missing")
    if not isinstance(raw, str):
        raise TypeError("PORT must be text")
    if not raw.strip():
        raise ValueError("PORT is empty")
    try:
        port = int(raw)
    except ValueError:
        raise ValueError("PORT must be an integer") from None
    if not 1 <= port <= 65535:
        raise ValueError("PORT is outside 1..65535")
    return port

for sample in ("8080", None, "", "wrong", "65536"):
    try:
        print(parse_port(sample))
    except ValueError as error:
        print(error)

Правильно читайте иллюстративный результат

Прослеживание переданных входных данных дает 8080, затем PORT is missing, PORT is empty, PORT must be an integer и PORT is outside 1..65535. Это ожидаемые результаты показанной логики, а не отчет о выполненном тесте развертывания. int также принимает некоторые текстовые формы, такие как окружающие пробелы; добавьте более строгое лексическое правило, если контракт вашего приложения требует этого.

Для реального процесса импортируйте os и передайте os.getenv("PORT") в функцию. Оставьте любую политику выбора необязательного значения по умолчанию вне парсера, чтобы было ясно, должна ли отсутствующая обязательная настройка остановить запуск.

Явно интерпретируйте булевы значения

bool("false") равно True, потому что непустая строка истинна. Вместо этого нормализуйте поддерживаемое текстовое представление и найдите его в явном отображении. Можно принимать true, yes, on и 1 как истину, а false, no, off и 0 как ложь; отклоняйте другие строки, а не молча включите функцию.

ConfigParser.getboolean(section, option) предлагает такие преобразования для опций в объекте ConfigParser. Он не преобразует автоматически строку, полученную из os.getenv. Это отдельные интерфейсы.

Проверяйте перед началом полезной работы

Собирайте настройки и проверяйте их перед подключением к базам данных, открытием слушающего сокета или запуском фоновых задач. Верните одну четкую ошибку конфигурации супервизору процесса. Перехват каждой ошибки и продолжение с угаданными значениями по умолчанию может скрыть сломанное развертывание.

После проверки храните объект конфигурации с преобразованными значениями. Постоянное чтение и парсинг значения среды в каждом запросе сложнее анализировать и может привести к тому, что разные части приложения используют разные политики.

Задавайте порядок приоритетов в своем приложении

Если приложение использует аргументы командной строки, переменные среды и INI-файл, определите, какой источник побеждает. Возможная политика: явно переданный аргумент, затем присутствующая настройка среды, затем опция файла, затем задокументированное значение по умолчанию. Это выбор приложения, а не встроенный порядок, enforced configparser.

ConfigParser может читать файлы и выполнять преобразования опций, но он не объединяет автоматически операционную среду или аргументы командной строки. Не описывайте файл .env как уже загруженный, если только лаунчер или явная библиотека его не загрузили.

Сообщайте имя настройки без ее секретного значения

Записывайте имя и категорию проверки, например DATABASE_URL is missing, без включения строки подключения. Токен может появиться внутри URL, а не только в настройке, имя которой содержит PASSWORD. Избегайте выгрузки всех переменных среды при диагностике запуска.

Для несекретной настройки отдельно решите, уместно ли отображать ее значение. Пример парсера использует фиксированные сообщения об ошибках, чтобы сделать это различие простым.

Понимайте, что меняют изменения конфигурации процесса

os.environ представляет среду текущего процесса и захватывается при импорте os. Его обновление меняет этот процесс и может влиять на запущенных им дочерние процессы; оно не перенастраивает уже работающий независимый процесс. При изменении настроек развертывания перезапустите или явно перенастройте соответствующий сервис.

Поведение операционной системы различается, включая обработку регистра имен в Windows. Интерфейс среды в байтах доступен только там, где os.supports_bytes_environ это разрешает. Используйте обычный строковый интерфейс для обычной конфигурации приложения, если документированное требование платформы не требует иного.

Что проверить

  • Отсутствующие, пустые, некорректные и выходящие за диапазон настройки имеют явные исходы.
  • Приложение определяет порядок источников, а не предполагает, что парсер объединяет источники.
  • Преобразование булевых значений не использует bool для сырой строки среды.
  • Диагностика идентифицирует настройку, не выводя учетные данные.

Это руководство охватывает конфигурацию процесса из стандартной библиотеки. Оно не реализует загрузчик .env, не проверяет доступность сетевого порта и не проверяет права развертывания. Требования, зависящие от приложения, могут потребовать дополнительной проверки.

Источники

  1. Python: os environment access ↗
  2. Python: configuration value conversion ↗
Наверх ↑