struckt
This commit is contained in:
106
app.api/main.py
Normal file
106
app.api/main.py
Normal file
@@ -0,0 +1,106 @@
|
||||
"""
|
||||
FastAPI приложение для взаимодействия с Telegram ботом
|
||||
"""
|
||||
|
||||
from fastapi import FastAPI, Depends, HTTPException, status
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
from sqlalchemy.orm import Session
|
||||
from contextlib import asynccontextmanager
|
||||
import logging
|
||||
import sys
|
||||
import os
|
||||
|
||||
# Добавляем путь к текущей директории
|
||||
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
from database.database import db, get_db_session, init_database, test_db_connection
|
||||
from database.models import User, Message, BotSettings
|
||||
from routers import (
|
||||
users_router, messages_router, settings_router,
|
||||
test_categories_router, tests_router, questions_router,
|
||||
answer_options_router, images_router
|
||||
)
|
||||
from schemas import HealthCheckResponse, RootResponse
|
||||
from config import config
|
||||
|
||||
# Настройка логирования
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@asynccontextmanager
|
||||
async def lifespan(app: FastAPI):
|
||||
"""Управление жизненным циклом приложения"""
|
||||
# Инициализация при запуске
|
||||
logger.info("Запуск FastAPI приложения...")
|
||||
|
||||
# Проверка подключения к БД
|
||||
if not test_db_connection():
|
||||
logger.error("Не удалось подключиться к базе данных!")
|
||||
raise Exception("Database connection failed")
|
||||
|
||||
# Создание таблиц если они не существуют
|
||||
try:
|
||||
init_database()
|
||||
logger.info("База данных инициализирована")
|
||||
except Exception as e:
|
||||
logger.error(f"Ошибка инициализации базы данных: {e}")
|
||||
raise
|
||||
|
||||
yield
|
||||
|
||||
# Очистка при завершении
|
||||
logger.info("Завершение работы FastAPI приложения...")
|
||||
db.close()
|
||||
|
||||
# Создание FastAPI приложения
|
||||
app = FastAPI(
|
||||
title=config.TITLE,
|
||||
description=config.DESCRIPTION,
|
||||
version=config.VERSION,
|
||||
lifespan=lifespan
|
||||
)
|
||||
|
||||
# Настройка CORS
|
||||
app.add_middleware(
|
||||
CORSMiddleware,
|
||||
allow_origins=config.CORS_ORIGINS,
|
||||
allow_credentials=config.CORS_CREDENTIALS,
|
||||
allow_methods=config.CORS_METHODS,
|
||||
allow_headers=config.CORS_HEADERS,
|
||||
)
|
||||
|
||||
# Подключение роутеров
|
||||
app.include_router(users_router, prefix=config.API_V1_PREFIX)
|
||||
app.include_router(messages_router, prefix=config.API_V1_PREFIX)
|
||||
app.include_router(settings_router, prefix=config.API_V1_PREFIX)
|
||||
|
||||
# Подключение роутеров для системы тестирования
|
||||
app.include_router(test_categories_router, prefix=config.API_V1_PREFIX)
|
||||
app.include_router(tests_router, prefix=config.API_V1_PREFIX)
|
||||
app.include_router(questions_router, prefix=config.API_V1_PREFIX)
|
||||
app.include_router(answer_options_router, prefix=config.API_V1_PREFIX)
|
||||
app.include_router(images_router, prefix=config.API_V1_PREFIX)
|
||||
|
||||
@app.get("/", response_model=RootResponse)
|
||||
async def root():
|
||||
"""Корневой эндпоинт"""
|
||||
return RootResponse(
|
||||
message=config.TITLE,
|
||||
version=config.VERSION,
|
||||
status="running"
|
||||
)
|
||||
|
||||
@app.get("/health", response_model=HealthCheckResponse)
|
||||
async def health_check():
|
||||
"""Проверка состояния приложения"""
|
||||
db_status = test_db_connection()
|
||||
return HealthCheckResponse(
|
||||
status="healthy" if db_status else "unhealthy",
|
||||
database="connected" if db_status else "disconnected"
|
||||
)
|
||||
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import uvicorn
|
||||
uvicorn.run("main:app", host=config.HOST, port=config.PORT, reload=config.RELOAD)
|
||||
Reference in New Issue
Block a user