Короткий ответ
Стоит прежде всего сравнить фактическую конфигурацию окружений: значения app.config (включая DEBUG/TESTING/SECRET_KEY), версии зависимостей, переменные окружения и используемую БД — локальные тесты часто неявно используют иные настройки (SQLite in-memory, другой часовой пояс, иная версия библиотеки), чем production.
Как это работает подробнее
Расхождение поведения при одинаковом коде почти всегда означает разницу во входных условиях: другая версия Python/библиотеки, другая настройка БД (диалект SQL, часовой пояс, кодировка), отсутствующая в production переменная окружения, другой режим DEBUG/TESTING, влияющий на обработку исключений Flask.
Пример кода
example.txt
Чек-лист для диагностики расхождения local vs production:
1. python --version и pip freeze на обеих средах - сравнить diff.
2. app.config["DEBUG"], app.config["TESTING"], часовой пояс, SQLALCHEMY_DATABASE_URI.
3. Диалект БД: SQLite (локально/тесты) vs PostgreSQL/MySQL (production) -
разное поведение NULL, уникальных constraint, регистра строк при сравнении.
4. Переменные окружения: вывести список обязательных и проверить, что все
установлены в production (например, через healthcheck-эндпоинт для DEBUG-only).
Результат диагностики должен указывать на конкретное отличие конфигурации,
а не просто подтверждать "у меня работает".Что использовать на практике
- Практика. Эффективная диагностика — явно вывести/залогировать на обеих средах: версию Python и ключевых пакетов (
pip freeze), значения ключевыхapp.config, фактический SQL-диалект БД. Часто причина — в тестах используется SQLite, а в production PostgreSQL/MySQL с другими правилами типов или ограничениями, которые не проявляются на SQLite.
Подводные камни
- Риск. Сразу начинают переписывать бизнес-логику, предполагая баг в коде, хотя код идентичен в обеих средах; не фиксируют версии зависимостies (
requirements.txtбез точных версий), из-за чего локально и в CI/production установлены разные minor-версии библиотек с разным поведением.