Em algumas situações, você pode precisar usar um servidor proxy como Traefik ou Nginx com uma configuração que adiciona um prefixo de caminho extra que não é visto pela sua aplicação.
Nesses casos, você pode usar root_path para configurar sua aplicação.
O root_path é um mecanismo fornecido pela especificação ASGI (que o FastAPI utiliza, através do Starlette).
O root_path é usado para lidar com esses casos específicos.
E também é usado internamente ao montar sub-aplicações.
Ter um proxy com um prefixo de caminho removido, nesse caso, significa que você poderia declarar um caminho em /app no seu código, mas então, você adiciona uma camada no topo (o proxy) que colocaria sua aplicação FastAPI sob um caminho como /api/v1.
Nesse caso, o caminho original /app seria servido em /api/v1/app.
Embora todo o seu código esteja escrito assumindo que existe apenas /app.
E o proxy estaria "removendo" o prefixo do caminho dinamicamente antes de transmitir a solicitação para o servidor da aplicação (provavelmente Uvicorn via CLI do FastAPI), mantendo sua aplicação convencida de que está sendo servida em /app, para que você não precise atualizar todo o seu código para incluir o prefixo /api/v1.
Até aqui, tudo funcionaria normalmente.
Mas então, quando você abre a interface de documentação integrada (o frontend), ele esperaria obter o OpenAPI schema em /openapi.json, em vez de /api/v1/openapi.json.
Então, o frontend (que roda no navegador) tentaria acessar /openapi.json e não conseguiria obter o OpenAPI schema.
Como temos um proxy com um prefixo de caminho de /api/v1 para nossa aplicação, o frontend precisa buscar o OpenAPI schema em /api/v1/openapi.json.
Dica
O IP 0.0.0.0 é comumente usado para significar que o programa escuta em todos os IPs disponíveis naquela máquina/servidor.
A interface de documentação também precisaria do OpenAPI schema para declarar que API server está localizado em /api/v1 (atrás do proxy). Por exemplo:
{"openapi":"3.1.0",// Mais coisas aqui"servers":[{"url":"/api/v1"}],"paths":{// Mais coisas aqui}}
Neste exemplo, o "Proxy" poderia ser algo como Traefik. E o servidor seria algo como CLI do FastAPI com Uvicorn, executando sua aplicação FastAPI.
Você pode obter o root_path atual usado pela sua aplicação para cada solicitação, ele faz parte do dicionário scope (que faz parte da especificação ASGI).
Aqui estamos incluindo ele na mensagem apenas para fins de demonstração.
Alternativamente, se você não tiver uma maneira de fornecer uma opção de linha de comando como --root-path ou equivalente, você pode definir o parâmetro --root-path ao criar sua aplicação FastAPI:
Portanto, ele não esperará ser acessado em http://127.0.0.1:8000/api/v1/app.
O Uvicorn esperará que o proxy acesse o Uvicorn em http://127.0.0.1:8000/app, e então seria responsabilidade do proxy adicionar o prefixo extra /api/v1 no topo.
Tenha em mente que um proxy com prefixo de caminho removido é apenas uma das maneiras de configurá-lo.
Provavelmente, em muitos casos, o padrão será que o proxy não tenha um prefixo de caminho removido.
Em um caso como esse (sem um prefixo de caminho removido), o proxy escutaria em algo como https://myawesomeapp.com, e então se o navegador acessar https://myawesomeapp.com/api/v1/app e seu servidor (por exemplo, Uvicorn) escutar em http://127.0.0.1:8000 o proxy (sem um prefixo de caminho removido) acessaria o Uvicorn no mesmo caminho: http://127.0.0.1:8000/api/v1/app.
mas desta vez no URL com o prefixo de caminho fornecido pelo proxy: /api/v1.
Claro, a ideia aqui é que todos acessariam a aplicação através do proxy, então a versão com o prefixo de caminho /api/v1 é a "correta".
E a versão sem o prefixo de caminho (http://127.0.0.1:8000/app), fornecida diretamente pelo Uvicorn, seria exclusivamente para o proxy (Traefik) acessá-la.
Isso demonstra como o Proxy (Traefik) usa o prefixo de caminho e como o servidor (Uvicorn) usa o root_path da opção --root-path.
A maneira "oficial" de acessar a aplicação seria através do proxy com o prefixo de caminho que definimos. Então, como esperaríamos, se você tentar a interface de documentação servida diretamente pelo Uvicorn, sem o prefixo de caminho no URL, ela não funcionará, porque espera ser acessada através do proxy.
Este é um caso de uso mais avançado. Sinta-se à vontade para pular.
Por padrão, o FastAPI criará um server no OpenAPI schema com o URL para o root_path.
Mas você também pode fornecer outros servers alternativos, por exemplo, se quiser que a mesma interface de documentação interaja com ambientes de staging e produção.
Se você passar uma lista personalizada de servers e houver um root_path (porque sua API está atrás de um proxy), o FastAPI inserirá um "server" com esse root_path no início da lista.
{"openapi":"3.1.0",// Mais coisas aqui"servers":[{"url":"/api/v1"},{"url":"https://stag.example.com","description":"Staging environment"},{"url":"https://prod.example.com","description":"Production environment"}],"paths":{// Mais coisas aqui}}
Dica
Perceba o servidor gerado automaticamente com um valor url de /api/v1, retirado do root_path.
Se você precisar montar uma sub-aplicação (como descrito em Sub Aplicações - Montagens) enquanto também usa um proxy com root_path, você pode fazer isso normalmente, como esperaria.
O FastAPI usará internamente o root_path de forma inteligente, então tudo funcionará. ✨