test-docker / main.py
ZakharZokhar's picture
Update main.py
d3af375 verified
raw
history blame
No virus
2.56 kB
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))