Промежуточное программное обеспечение FASTAPI Global Timeout не работает на маршрутах синхронизацииPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Промежуточное программное обеспечение FASTAPI Global Timeout не работает на маршрутах синхронизации

Сообщение Anonymous »

Я пытаюсь обеспечить глобальное время ожидания запроса в моем приложении 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»