Я пытаюсь обеспечить глобальное время ожидания запроса в моем приложении FastAPI, используя пользовательскую TimeoutMiddleware. Предполагается, что промежуточное программное обеспечение отменяет любой запрос, который занимает больше времени, чем указанный тайм -аут.from starlette.middleware.base import BaseHTTPMiddleware
from fastapi import FastAPI, Request
from starlette.responses import JSONResponse
import asyncio
class TimeoutMiddleware(BaseHTTPMiddleware):
def __init__(self, app, timeout: int = 5):
super().__init__(app)
self.timeout = timeout
async def dispatch(self, request: Request, call_next):
try:
response = await asyncio.wait_for(call_next(request), timeout=self.timeout)
return response
except asyncio.TimeoutError:
return JSONResponse(status_code=408, content={"detail": "Request Timeout"})
def create_app(routers, timeout: int = 2) -> FastAPI:
app = FastAPI()
app.add_middleware(TimeoutMiddleware, timeout=timeout)
for router, prefix in routers:
app.include_router(router, prefix=prefix)
return app
< /code>
Проблема:
Промежуточное программное обеспечение работает правильно для асинхрологических маршрутов, но не работает для синхронизации.import asyncio
from fastapi import APIRouter
aparat_router = APIRouter()
@aparat_router.api_route("/video", methods=["GET", "POST"])
async def aparat_messages():
await asyncio.sleep(5) # This correctly triggers the timeout
return {"message": "Delayed Response"}
< /code>
Пример, где тайм -аут не работает: < /p>
import time
from fastapi import APIRouter
aparat_router = APIRouter()
@aparat_router.api_route("/video", methods=["GET", "POST"])
def aparat_messages():
time.sleep(5) # This does NOT trigger the timeout
return {"message": "Delayed Response"}
< /code>
Ожидаемое поведение:
как синхронизационные, так и асинхронные маршруты должны уважать тайм -аут и вернуть тайм -аут запроса 408, если выполнение превышает предел.
Фактическое поведение:
Timeout работает только для Async Routes. синхронные маршруты? Есть ли лучший подход к обработке тайм -аутов запроса в FastAPI, который поддерживает как синхронизацию, так и асинхронные маршруты? < /P>
fastapi==0.104.0
uvicorn==0.23.0
Подробнее здесь: https://stackoverflow.com/questions/795 ... ync-routes
Промежуточное программное обеспечение FASTAPI Global Timeout не работает на маршрутах синхронизации ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Добавить AUTH в FASTAPI через промежуточное программное обеспечение и включить в OpenAPI
Anonymous » » в форуме Python - 0 Ответы
- 5 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Добавить AUTH в FASTAPI через промежуточное программное обеспечение и включить в OpenAPI
Anonymous » » в форуме Python - 0 Ответы
- 7 Просмотры
-
Последнее сообщение Anonymous
-