Skip to content

Oseiasdfarias/full_fast_api

Repository files navigation

Sumário

FastAPI - ToDo List com Cadastro de Usuário Autenticação e Autorização

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]

Loading

Visão Geral

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.


Requisitos do projeto

Configuração do Ambiente

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.

Instalando as dependências do 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.


Rodando o Porjeto Localmente

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.

Formatação do Código

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

Rodando os Testes

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%

Rodando a API

❯ task run

Saída:

Acesando a documentação da API

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.

Dados no Banco de Dados

A imgem abaixo é a visalização dos dados usando o DBeaver, foi usando o SQLite como banco de dados para perssistir os dados.


Dockenização da Aplicação

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.


Automatizando os testes com Integração Contínua (CI)

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.


Deploy no Fly.io e persistência de dados no Render

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 .

Log a aplicação no Fly.io

Banco de dados no Render


🎥 Rede Social

About

Projeto completo com Fast API do Python.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages