Оптимизация и рефакторинг FastAPI‑сервиса

requests.get блокирует event loop внутри async-ручки. Используйте async HTTP-клиент либо сделайте ручку синхронной; добавьте timeout, валидацию пагинации и контролируемые ошибки.

Короткий ответ

Что ответить на собеседовании

requests.get блокирует event loop внутри async-ручки. Используйте async HTTP-клиент либо сделайте ручку синхронной; добавьте timeout, валидацию пагинации и контролируемые ошибки.

Подробный разбор

Ответ с пояснениями

Условие

Выполните рефакторинг представленного FastAPI‑кода, выявив и исправив потенциальные проблемные места. Приложение реализует эндпоинт для получения списка лайков, делая внешний HTTP‑запрос.


from uuid import UUID
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import requests

app = FastAPI()

class Like(BaseModel):
    id: UUID
    publication_id: UUID

def fetch_likes(size: int, offset: int, extra_params: dict = {}):
    response = requests.get('http://example.com/slow-request', params={'size': size, 'offset': offset, **extra_params})
    if response.status_code == 200:
        return response.json()
    else:
        raise HTTPException(status_code=response.status_code, detail="Failed to fetch data")

@app.post("/get-likes-list")
async def get_likes_list(size: int, offset: int):
    return fetch_likes(size, offset)

``

Ответ

requests.get блокирует event loop внутри async-ручки. Используйте async HTTP-клиент либо сделайте ручку синхронной; добавьте timeout, валидацию пагинации и контролируемые ошибки.

Минимальный путь без смены HTTP-библиотеки — заменить async def на обычный def: FastAPI выполнит синхронный обработчик вне event loop. Для полноценной async-версии создайте один долгоживущий async-клиент в lifespan и переиспользуйте соединения.

Уберите изменяемый default extra_params={}, ограничьте size и не допускайте отрицательный offset. Сейчас extra_params может переопределить оба значения; разрешайте только известные ключи. Проверяйте JSON по list[Like], обрабатывайте timeout отдельно от некорректного ответа. Ошибки upstream обычно переводят в 502/504, а не слепо возвращают любой его статус. Адрес и секреты должны приходить из конфигурации, внешняя передача — по HTTPS.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее