3.7 KiB
3.7 KiB
Как писать Flask-приложение для Nubes
Структура папок (ОБЯЗАТЕЛЬНО)
repo/
├── requirements.txt
└── site/
├── app.py # точка входа
├── static/
│ └── style.css
└── templates/
└── index.html
БЕЗ site/ папки — НЕ ЗАПУСТИТСЯ. Платформа ждёт именно site/app.py.
app.py — точка входа
Минимальный рабочий вариант:
from flask import Flask, render_template
app = Flask(__name__, template_folder="templates", static_folder="static")
@app.route("/")
def index():
return render_template("index.html")
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0", port=5000)
КЛЮЧЕВЫЕ МОМЕНТЫ:
-
if __name__ == "__main__": app.run(host="0.0.0.0", port=5000)— ОБЯЗАТЕЛЬНО! Платформа запускаетpython site/app.py. Безapp.run()скрипт определитappи выйдет — контейнер упадёт. -
template_folder="templates",static_folder="static"— указывать явно. Без них Flask может не найти шаблоны при запуске из корня репо. -
debug=True— как в рабочем шаблоне. На проде заменить наFalse.
Модули (если нужно)
Можно дробить на модули внутри site/:
site/
├── app.py
├── api/
│ └── http_client.py
├── operations/
│ └── get_instances.py
├── routes/
│ └── main.py
├── static/
└── templates/
Импорты внутри site/:
# app.py
from routes.main import bp as main_bp
app.register_blueprint(main_bp)
# routes/main.py
from api.http_client import HttpClient
from operations.get_instances import get_organization
НЕ НУЖЕН sys.path.insert! При запуске python site/app.py Python сам добавляет site/ в sys.path[0].
⛔ НЕЛЬЗЯ:
site/__init__.py— удалить! Конфликтует со stdlibsite.py, ломает импорты.from site.xxx import ...— никогда. Импорт всегда без префиксаsite.- Factory pattern (
create_app()) — платформа ждётappна уровне модуля.
requirements.txt
Flask>=3.0
gunicorn>=21.2
requests>=2.31
Переменные окружения (jsonEnv в параметрах сервиса)
{
"NUBES_API_TOKEN": "...",
"NUBES_API_ENDPOINT": "https://lk-api-gateway-test.ngcloud.ru/api/v1/svc"
}
В коде читать через os.getenv("NUBES_API_TOKEN", "").
Деплой
gitPath: URL репозиторияjsonEnv: переменные окруженияhealthPath: можно оставить""
Отладка
Если под не стартует — смотреть логи в кубере:
kubectl -n <instanceUid> logs deploy/pythonk8s --tail=50
kubectl -n <instanceUid> get pods
Частые ошибки
| Ошибка | Причина | Решение |
|---|---|---|
| Под Completed, рестарты | Нет app.run() |
Добавить if __name__ == "__main__": app.run(...) |
| ModuleNotFoundError | Есть site/__init__.py |
Удалить site/__init__.py |
| 500 на / | API недоступен или токен неверный | Обернуть в try/except |
| Нет папки site/ | Другая структура | Всегда site/app.py |