Задача курса

Настройки FastAPI из переменных окружения: задача

Курс «FastAPI для начинающих: API с базой данных и тестами» · урок «Настройки приложения»

Условие

Настройки Roomly без секрета в исходнике

Roomly получает настройки из окружения процесса. Секретное значение обязательно: если оно не передано, создание настроек завершается ошибкой. Публичное имя можно переопределить; если его не задали, используется «Roomly».

Приложение использует один объект настроек, созданный при старте. Поздние изменения окружения не меняют этот объект. Через /info пользователь получает только публичное имя — без секрета, его части или длины.

Реализуйте такую конфигурацию, не записывая секрет в исходник. В этой лабе секрет проверяется как обязательная настройка; авторизация и криптографические операции не выполняются.

Что уже дано

Это самостоятельная конфигурационная лаба в одном видимом файле, не замена полного CRUD-проекта. В шаблоне есть app и незавершённые Settings, settings, get_settings и /info. Пакет pydantic-settings уже установлен. Перед вашим файлом служебная подготовка задаёт только искусственные переменные worker: SECRET_KEY="synthetic-start-only-8241" и APP_NAME="Roomly — учебный стенд". Задавать их в решении, читать настоящие ключи или создавать .env не нужно.

Подготовка и публичный RPC используют только искусственные настройки в процессе этой задачи. Диагностические вызовы временно меняют эти тестовые переменные, создают Settings(), возвращают структуру тестовой конфигурации или полей ValidationError и восстанавливают собственные fixtures. Это технический канал проверки, а не HTTP /info: только в нём могут передаваться заведомо искусственные значения. Отдельно проверяются тип BaseSettings, тот же экземпляр settings и получение результата get_settings через Depends. Писать диагностику и подстановки не требуется.

Что нужно сделать

Опишите публичный класс Settings, наследующий BaseSettings из pydantic_settings: обязательное secret_key: str без default и app_name: str с default "Roomly". Вызов Settings() без аргументов должен брать SECRET_KEY и APP_NAME из окружения. При отсутствии SECRET_KEY создание объекта даёт ValidationError с loc secret_key и типом missing; пустая строка допустима. Default имени действует только при отсутствии APP_NAME, а не вместо явно переданной пустой строки.

Создайте публичный settings = Settings() один раз на верхнем уровне. Функция get_settings() возвращает этот же объект. GET /info получает его через Depends и возвращает200 с ровно {"app": публичное имя}. В HTTP-ответе нет секрета, его части, длины или полного объекта Settings. Имена обработчика и его параметра свободны.

Поздние изменения окружения не меняют уже созданный settings и ответы /info; новый самостоятельный вызов Settings() читает новые значения. Подключение Depends должно передавать объект обработчику, а не сопровождать его ручной вызов. Не добавляйте проверки стойкости ключа, авторизацию, запись файлов или новый CRUD.

Ввод и вывод

stdin не используется. Печатать через print в stdout ничего не нужно. После выполнения файла проверяющая система обращается к верхнеуровневому app: публичный переходник вызывает TestClient внутри процесса приложения и передаёт результат скрытой проверке. Запускать Uvicorn, сеть, клиентский скрипт или pytest не требуется.

При заданных учебных переменных GET /info возвращает200 с {"app":"Roomly — учебный стенд"}. В новом окружении с SECRET_KEY, но без APP_NAME, новый объект Settings получает имя "Roomly"; отсутствие самого SECRET_KEY не заменяется значением из исходника.

Попробуйте решить

РешениеPython
Без регистрации · результат не сохраняется