from fastapi import FastAPI, HTTPException, Body, Request, File, UploadFile, BackgroundTasks from pydantic import BaseModel import logging from fastapi.responses import JSONResponse from fastapi.templating import Jinja2Templates import httpx # Настройка логгера logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) # Создание обработчика для вывода в консоль console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO) formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') console_handler.setFormatter(formatter) logger.addHandler(console_handler) app = FastAPI() # Определяем модель данных для запроса class TextRequest(BaseModel): text: str # Подключаем шаблоны Jinja2 templates = Jinja2Templates(directory="templates") async def send_post_request(url: str, filename: str): logger.info(f"POST request must be sent to {url} with filename: {filename}") try: async with httpx.AsyncClient() as client: response = await client.post(url, data={"text": filename}) # Проверяем статус код ответа if response.status_code != 200: raise HTTPException(status_code=response.status_code, detail="Request failed") except Exception as e: raise HTTPException(status_code=500, detail=f"Failed to send POST request: {str(e)}") # Главная страница с текстом "server is running" @app.get("/") async def read_root(request: Request): return templates.TemplateResponse("index.html", {"request": request, "text": "server is running"}) # Определяем единственный POST endpoint @app.post("/echo") def echo_text(text_request: TextRequest): # Просто возвращаем поле text из запроса return {"echoed_text": text_request.text} # Endpoint для загрузки файла @app.post("/upload/") async def upload_file_and_post(file: UploadFile = File(...), url: str = "", background_tasks: BackgroundTasks = BackgroundTasks()): try: # Добавляем задачу на отправку POST запроса в фоновые задачи background_tasks.add_task(send_post_request, url, file.filename) # Возвращаем имя файла в ответе return JSONResponse(content={"filename": file.filename}) except Exception as e: raise HTTPException(status_code=500, detail=str(e))