E aí, tudo bem?
Este repositório foi desenvolvido para ser boilerplate de uma API desenvolvida usando FastAPI. A aplicação deste projeto, por padrão, é agnóstica de banco de dados com sua arquitetura focada em "cloud" e "factory". Desta forma poderemos desenvolver diretamente no docker reduzindo problemas inconvenientes durante o deploy da aplicação.
No gif abaixo, você pode observar uma das vantagens: mesmo ao executar no ambiente Docker, a funcionalidade de autoreload permanece ativa.
- Em Desenvolvimento
Este projeto é atualizado periodicamente.
- 0.1.0
Vamos entender a disposição dos arquivos deste projeto, que foi distribuído entre os seguintes arquivos e pastas:
- app
- configuration
- docker
- docs
- migrations
- tests
- .python-version
- alembic.ini
- docker-compose.dev.yaml
- docker-compose.prod.yaml
- docker-compose.test.yaml
- poetry.lock
- pyproject.toml
Nesta pasta encontramos os arquivos principais da aplicação. Ela se divide em:
- 📁 api
- 📁 core
- 📁 utils
- 📋 main.py
Esta pasta contém uma pasta chamada endpoint que contém as rotas da API e uma pasta chamada events, que contém os eventos que devem ser registrados no startup e shutdown da aplicação.
Nesta pasta ficam os arquivos que dão sustentação a aplicação, neste caso são as pastas:
- controllers
- database
- dependencies
- metadata
- models
- schemas
- security
Esta pasta é destinada a todo código que dá suporte a aplicação.
Este arquivo constitui o núcleo da aplicação FastAPI. Nele, encontramos a definição da aplicação por meio da criação de uma instância da classe FastAPI, que foi definida como:
app: FastAPI
Nesta pasta encontramos as configurações da nossa aplicação. As configurações serão armazenadas como variáveis de ambiente, e podem ser definidas como 4 tipos/chaves:
[default] -> Os valores contidos nessa chave, serão atribuido como padrão.
[production] -> Os valores contidos nessa chave, serão atribuido em modo de produção.
[development] -> Os valores contidos nessa chave, serão atribuido em modo de devesenvolvimento.
[testing] -> Os valores contidos nessa chave, serão atribuido em modo de teste.
Os arquivos contidos nesta pasta são:
- 📋 .secrets (deve ser criado por você)
- 📋 configs.py
- 📋 .settings.toml
Neste arquivo ficarão os dados sensíveis que não deve subir para o repositório, como, por exemplo:
[default]
JWT_SECRET = ""
ALGORITHM = ""
DATABASE_URL = ""
[production]
JWT_SECRET = ""
DATABASE_URL = ""
[development]
JWT_SECRET = ""
DATABASE_URL = ""
[testing]
JWT_SECRET = ""
DATABASE_URL = ""
Este arquivo possui a instância da classe Dynaconf que será usada pela aplicação. Ela usa as variáveis de ambiente conforme o modo que a aplicação está rodando. Este modo e definido através da variável de ambiente FASTAPITEMPLATE_APP_RUNNING_MODE. A instância da classe foi definida como:
settings: Dynaconf
Neste arquivo ficarão as configurações menos sensíveis, mas não por isso, menos essenciais, como, por exemplo:
[default]
API_URL = "/api/v1"
SERVER_RELOAD = 1
[production]
API_URL = "/api/v1"
[development]
API_URL = "/api/v1"
[testing]
API_URL = "/api/v1"
Nesta pasta ficam os arquivos referente ao Docker, como exceção do docker-compose.*.yaml
- 📋 .dev.env
- 📋 .prod.env
- 📋 .test.env
- 📋 Dockerfile.api
Estes arquivos possuem as variáveis de ambiente que serão usadas para criação dos containers através do docker-compose. Todos eles possuem as mesmas chaves, mas os valores podem variar conforme a necessidade. Abaixo um exemplo do arquivo:
POSTGRES_DB=db_production
POSTGRES_USER=postgres
POSTGRES_PASSWORD=123
FASTAPITEMPLATE_DATABASE_URL=postgresql+asyncpg://postgres:123@db:5432/db_production
As variáveis iniciadas com POSTGRES serão usadas para criação do banco, já a variável FASTAPITEMPLATE_DATABASE_URL será usada para aplicação para se conectar com banco de dados. Adapte de acordo com sua necessidade.
Arquivo para definir a imagem da nossa aplicação.
Nesta pasta ficam os arquivos que retratam a documentação desta aplicação. Como, por exemplo, README.md
Essa pasta contém os arquivos referente as migrações do banco de dados. Estas migrações foram criadas usando o alembic.
Ainda não foi implementado testes de exemplo
Arquivo refente a versão python usada neste projeto
Arquivo de configuração do alembic
Os arquivos docker-compose.yml são como guias de receitas para o Docker. Ele diz ao Docker como configurar e interligar vários contêineres para funcionarem juntos. Nesse arquivo, você especifica coisas como: imagem de contêiner, serviço, portas, volumes, redes que eles vão usar e até mesmo as variáveis de ambiente.
Para definir qual modo a aplicação irá rodar você deve definir a variável de ambiente que fica dentro dos arquivos "docker-compose...". Tenha em mente que esta aplicação é feita para rodar em containers até mesmo durante o desenvolvimento. Os arquivos "docker-compose..." ficam na raiz do projeto.
Por exemplo:
...
FASTAPITEMPLATE_APP_RUNNING_MODE=development
...
Existe um arquivo para cada modo que a aplicação poderá rodar, nesta aplicação encontraremos:
- docker-compose.dev.yaml
- docker-compose.prod.yaml
- docker-compose.test.yaml
Este arquivo registra as versões específicas de todas as bibliotecas e dependências que seu projeto precisa para funcionar corretamente.
O arquivo pyproject.toml é um mapa de planejamento para projetos Python, onde você define as configurações e metadados do projeto. É um arquivo de configuração mais moderno e legível do que o antigo setup.py. Nele, você especifica detalhes como o nome do projeto, a versão do Python necessária, as dependências, scripts personalizados e até mesmo configurações específicas do ambiente de desenvolvimento.
Siga os passos abaixo:
git clone https://github.com/lspraciano/fastapiAPITemplate.git
No tópico sobre a estrutura do projeto vimos que alguns arquivos precisam ser adaptados de acordo com sua necessidade. Os arquivos serão listados abaixo para ajudar você:
- 📋 docker/.dev.env
- 📋 docker/.prod.env
- 📋 docker/.test.env
- 📋 configuration/.secrets.toml
Na dúvida reveja o tópico sobre a estrutura do projeto para entender melhor qual o conteúdo desses arquivos.
Após ajustar os arquivos básicos, vamos rodar a aplicação. Lembre que para cada modo que a aplicação poderá ser iniciada temos um arquivo docker-compose... para tal. Vamos neste exemplo rodar em modo de "development".
cd fastapiAPITemplate
docker compose -f docker-compose.dev.yaml up
Neste padrão de projeto, assim que você realizar alterações na aplicação, não será necessário reiniciar o docker, pois "bindamos" a pasta para garantir o reload