FastAPI: обработка запросов по всем путям одинаково

Задача: есть сервис, для работы которого необходим reverse-proxy.

Для реализации этого reverse-proxy выбран fast-api. В логике этого прокси не должно быть никакой работы с путями, он просто должен принять запрос, добавить к нему заголовок отправить его через requests в другое место, и полученый там ответ вернуть.

на примере гет запроса: если пользователь обратится на путь /, то тогда считаем, что сервис отработал верно, однако если пользователь обратится, скажем на /catalog1/ то выдаст 404 (а специфика задачи именно в том, что я не знаю ничего о том, какие каталоги могут появиться, нужно переадресовать по пути, что указал пользователь)

@app.get('/')
def read_users():
    return [{"name": "Rick"}, {"name": "Morty"}]

Подскажите способ как можно сделать, чтобы одно и то же действие делалось вообще по любому пути.


Ответы (2 шт):

Автор решения: Kivz RK
@app.get("/{rel_path:path}")
async def get_handle(rel_path: str):
    print(rel_path)
    #rel_path - строковая переменная с путем
    ...
    return response
→ Ссылка
Автор решения: ykoavlil

Для тестирования обработки ошибок в вэб-приложении у меня возникла похожая задача.

Копировать реальные эдпоинты имитируемоего серверного приложения и делать для каждого из них ответы с разными кодами (200, 400 и тд) мне не хотелось.

Остановился на таком варианте:

from fastapi import FastAPI
from starlette.responses import JSONResponse

app = FastAPI()

@app.get(path="/{endpoint}")
def get_handle(endpoint):
    try:
        status_code = int(endpoint)
    except ValueError:
        status_code = 200

    return JSONResponse(
        content=[{"name": "Rick"}, {"name": "Morty"}],
        status_code=status_code
    )

Тело ответа всегда постоянно, а код зависит от эндпоинта.

То есть запрос /404 статус код 404

Если значение endpoint нельзя перевести в int статус код будет 200

Запрос /test статус код 200

Если значение endpoint можно перевести в int, но такого статус кода нет - будет ошибка.

→ Ссылка