API FLASK + MONGODB + DOCKER
Tags: braziliandevs, beginners, python, mongodb
Published: 2023-09-26 19:38:54

Nesta API, coloquei em prática o que venho estudando em Python, frameworks, Docker e banco de dados, algo que já venho aprendendo na Linuxtips e Alura.

Aproveitei a oportunidade de participar do 'Alura Challenges - Back-End' para colocar a mão na massa. O formato do desafio é de 4 semanas, onde a cada semana seriam implementadas funcionalidades para a API de acordo com as regras de negócio. Utilizei o GitHub Projects para organizar o projeto e gerenciar as issues. As funcionalidades da API incluem armazenar em um banco de dados as informações sobre vídeos (título, descrição, URL, categoria) baseados em categorias e fazer a gestão desse conteúdo por meio de requisições nos endpoints para criar, visualizar, atualizar e deletar as informações.

Optei por utilizar o Poetry para gerenciar as dependências do projeto e o Dynaconf para gerir as configurações do Flask. Utilizei o padrão de arquitetura 'Application Factories' para o projeto devido à simplicidade de gerir as configurações. Para formatação e lint do projeto de acordo com as boas práticas, fiz uso das bibliotecas 'flake8' e 'black'.

Para o banco de dados, escolhi trabalhar com um banco não relacional, o MongoDB, por já ter feito outros projetos com SQLite. Em desenvolvimento, utilizei o MongoDB rodando em um container Docker.

Adicionei um painel de Admin para gerir o banco de dados por meio de uma interface. No entanto, o foco é consumir a API por meio de requisições. Algo que gosto de implementar nos projetos, aprendido com o Bruno Rocha, é criar ferramentas para gerir o projeto por linha de comando. Assim, criei um CLI utilizando 'click'. Adicionei uma camada de segurança com o 'flask-simplelogin' para solicitar usuário e senha nas rotas e utilizei o 'flask-jwt-extended' para criar e verificar as requisições com tokens.

![utilização cli](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hp668qf4xp5apmxjlh70.gif)


![utilização admin](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o68su2n6x00cs75m4t24.gif)

Para os testes unitários e de integração, utilizei o 'pytest' e 'pytest-cov' para acompanhar a cobertura dos testes. Utilizei o codecov.io para exibir um badge no 'readme' com um painel contendo as informações dos resultados.


![utilização codecov.io](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ka7a84ffu4x02azup88r.gif)

Na Integração Contínua, utilizei o GitHub Actions para criar um pipeline que verifica a formatação de acordo com as boas práticas do Python, executa um container Docker (para servir como um banco de dados MongoDB de teste), roda os testes unitários e de integração e publica os resultados no codecov.io.


![utilização api](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6sk4xq42tplwn7cmrilc.gif)

Realizei o deploy no render.com, que é uma alternativa ao Heroku (que atualmente não oferece uma opção gratuita). Também utilizei o 'Docker Compose' para rodar um container e consumir localmente a API e o banco de dados. Existem vários pontos de refatoração é claro, como exercício, fiquei feliz com o resultado e com todas as dificuldades encontradas, das quais pude aprender muito.

Repositório GitHub: https://github.com/joseevilasio/my-videos-lib