graph TD;
A[FastAPI] --> A1[Controle de acesso / Gerenciamento de usuários] --> A2[Gerenciamento de usuários]
A2 --> A3[Criação de usuário]
A2 --> A4[Atualização de usuário]
A2 --> A5[Remoção de usuário]
A1 --> A6[Acesso via JWT]
A --> B[ToDo List]
B --> B1[Criação de tarefas]
B --> B2[Pegar tarefas]
B --> B3[Atualização de tarefas]
B --> B4[Remoção de tarefa]
Projeto completo de uma Api Rest
com FastAPI
desenvolvida no curso ministrado pelo canal Live de Python.
A proposta consite em desenvolver um CRUD
de cadastro de usuário com autenticação
e autorização
de usuário
e outro CRUD
para uma aplicação ToDo List
que se relaciona com a base de dados do usuário, assim, cada usuário cadastrado poderá ter um ToDo List
que só pode ser acessa pelo usuário que o criou. A imagem a baixo mostra o diagrama relacional das tabelas.
Recomendo que use o pyenv para instalar a versão 3.12.3
do Python.
caso não tenha o pyenv
instalado em sua máquina, você pode instala-lo usando o pipx, após instalar o pipx
basta rodar o seguinte comando.
❯ pipx install pyenv
Agora com o pyenv
instalado, basta roda o seguinte comando para instalar a versão 3.12.3
do Python.
❯ pyenv install 3.12.3
para definir a versão do python em seu projeto, você deve acessar pelo terminal o caminho do seu projeto e roda o comando abaixo em seu terminal.
❯ pyenv local 3.12.3
pronto, agora você tem o Python 3.12.3
definido para seu projeto.
Para instalar as dependências usando o poetry
basta executar o seguinte comando em seu terminal dentro da pasta raiz do projeto:
❯ poetry install
Caso queira instalar usando o pip
, use o comando abaixo:
❯ pip install -r requirements.txt
Warning
Certifique-se que seu ambiente esteja ativado.
Para executar os códigos, utilizaremos o taskipy
, uma biblioteca em Python
que facilita a criação de comandos para a execução de diversas ações.
Antes de executar o código é importante formatá-lo usando os pradrão definidos pela pep8, para fazer isso de forma automática basta rodar o seguinte comando no terminal:
❯ task format
Para rodar os testes basta executar o seguinte comando com o ambiente virtual ativado:
❯ task test
Saída:
All checks passed!
============================= test session starts =============================
platform linux -- Python 3.12.3, pytest-8.2.2, pluggy-1.5.0 -- /home/osfarias/workspace/workspace_python/fast_api/.venv/bin/python
cachedir: .pytest_cache
rootdir: /home/osfarias/workspace/workspace_python/fast_api
configfile: pyproject.toml
plugins: anyio-4.4.0, cov-5.0.0
collected 19 items
tests/test_app.py::test_read_root_deve_retornar_ok_e_ola_mundo PASSED [ 5%]
tests/test_app.py::test_create_user_username_existing PASSED [ 10%]
tests/test_app.py::test_create_user_email_existing PASSED [ 15%]
tests/test_app.py::test_create_user PASSED [ 21%]
tests/test_app.py::test_read_users PASSED [ 26%]
tests/test_app.py::test_read_users_with_user PASSED [ 31%]
tests/test_app.py::test_read_user PASSED [ 36%]
tests/test_app.py::test_read_user_with_user PASSED [ 42%]
tests/test_app.py::test_update_user PASSED [ 47%]
tests/test_app.py::test_update_user_not_found PASSED [ 52%]
tests/test_app.py::test_delete_user PASSED [ 57%]
tests/test_app.py::test_delete_user_not_oermission PASSED [ 63%]
tests/test_app.py::test_delete_user_not_found PASSED [ 68%]
tests/test_app.py::test_get_token PASSED [ 73%]
tests/test_app.py::test_get_token_incorret_email PASSED [ 78%]
tests/test_app.py::test_get_token_incorret_password PASSED [ 84%]
tests/test_db.py::test_create_user PASSED [ 89%]
tests/test_security.py::test_jwt PASSED [ 94%]
tests/test_security.py::test_jwt_invalid_token PASSED [100%]
---------- coverage: platform linux, python 3.12.3-final-0 -----------
Name Stmts Miss Cover
------------------------------------------
fast_api/__init__.py 0 0 100%
fast_api/app.py 61 0 100%
fast_api/database.py 4 0 100%
fast_api/models.py 12 0 100%
fast_api/schemas.py 17 0 100%
fast_api/security.py 40 3 92%
fast_api/settings.py 4 0 100%
------------------------------------------
TOTAL 138 3 98%
❯ task run
Saída:
A página localhost:8000/docs
do FastAPI é uma interface gerada automaticamente pela biblioteca que fornece uma documentação interativa para sua API. Baseada no Swagger UI, esta página permite que desenvolvedores visualizem e testem todas as rotas e endpoints da API diretamente no navegador. Cada endpoint é detalhado com informações sobre métodos HTTP suportados, parâmetros de entrada, respostas possíveis e modelos de dados. A funcionalidade interativa permite enviar requisições e visualizar as respostas, facilitando a verificação e o debugging da API durante o desenvolvimento. Essa documentação dinâmica é uma ferramenta poderosa para garantir que a API esteja funcionando conforme o esperado e para melhorar a produtividade dos desenvolvedores.
A imgem abaixo é a visalização dos dados usando o DBeaver
, foi usando o SQLite
como banco de dados para perssistir os dados.
Uma das formas de disponibilizar um projeto com todas as dependências configuradas e pronta para uso é a utilização do docker, para o projeto em questão, FOI usaDA uma imagem do Python 3.12
e realizado a instalação das demais dependências como o poetry
e Bibliotecas python
, além disso, foi usado uma imagem do postgreSQL
para realizar a pessistência dos dados. além das configurações necessárias para que a aplicação pudesse ter acesso ao container do banco de dados.
As configurações para a geração da imagem responsável por rodar a aplicação foram colocadas no arquivo Dockerfile
, o arquivo compose.yml
é responsável por estruturar os containers da aplicação FastAPI
e do PostgreSQL
além de realizar a configuração de comunicação entre a aplicação e o banco de dados.
Como requisito para rodar o projeto usando o docker, é necessário instalar o Docker e o Docker Compose.
com essas duas depêndencias instaladas, basta clonar esse repositório e acessar a pasta via terminal e executar o seguinte comando:
❯ docker compose up --build
Ao executar o comando, o docker irá baixar as imagens do Python 3.12
e a do PostgreSQL
além de realizar o Build
da aplicação, caso tudo ocorra como o planejato você terá a aplicação rodando em sua máquina.
basta acessar via navegador a aplicação pela url localhost:8000/docs
. para sair da aplicação, basta usar usar o Ctrl + C
do teclado.
Para automatizar os testes foi usando o GitActions, para isso foi implementado no arquivo .github/workflows/pipeline.yaml
as ações necessárias para rodar os códigos de testes. com isso toda vez que for feito um push
ou pull_request
no repositório será disparado um trigger que configurará o ambiente de testes e o realizará, caso os testes sejão bem sucedidos será imforamdo e caso contrário também, a imagem abaixo mostra um teste bem sucedido.
O deploy do projeto foi realizado no fly.io e para perssistir os dados foram usado o render.com com uma instância do banco PostegreSQL
.
Para realizar o deploy foi uasdo a CLI
do fly.io configurando as variáveis de ambiente usando o comando flyctl secrets set VARIÁVEL_DE_AMBIENTE=xxxxxxx
, já para o build do projeto e envio para a plataforma foi usado o comando flyctl deploy --local-only --ha=false
.