Série API em Flask - Parte 5 - MongoDB
Nesta seção vamos instalar os pacotes necessários para conectar com o MongoDB, através de um container docker e configurá-lo em nossa aplicação Flask. Não tem segredo e bem simples.
Para entendimento, segue os capítulos que serão abordados.
Capítulo 1: Introdução, configuração e Hello World
Capítulo 2: Organizando as dependências e requerimentos
Capítulo 3: Configurando o pytest e nosso primeiro teste
Capítulo 4: Configurando o Makefile
Capítulo 5: MongoDB Estamos aqui
Capítulo 6: Criando e testando o modelo de usuários
Capítulo 7: Criando usuários
Capítulo 8: Listando usuários
Capítulo 9: Buscando usuários
Capítulo 10: Editando um usuário
Capítulo 11: Deletando um usuário
Capítulo 12: Autênticação por JWT
Capítulo 13: Criando um container Docker
Capítulo 14: Arquivos de configuração para Deploy na Digital Ocean
Capítulo 15: Automatizando o processo de deploy com Fabric
Capítulo 16: CI e CD com Jenkins, Python, Flask e Fabric
Capítulo 17: Utilizando o RabbitMQ com Flask e Sendgrid para enviar e-mails de boas vindas e ativar a conta do usuário
O repositório com todo o código fonte esta aqui. Os capítulos estão em branches
.
Instalando o MongoDB
Indo direto ao ponto, vamos instalar o MongoDB em nosso sistema operacional através do Docker. Siga os passos do link anterior para instala-lo no ubuntu.
Após esse procedimento execute o seguinte comando $ docker run --name mongo-latest -p 27017:27017 -d mongo
. Através desse comando vamos criar um container do mongo
, chamada mongo-latest
, mapeando a porta 27017
do seu localhost para 27017
do container, rodando através de um daemon -d
.
MongoLab
Também podemos usar o Mlab para criarmos uma instância do Mongo. Ele possui um sandbook gratuito que será utilizado posteriormente para executarmos os nossos testes online.
Você pode assistir o video abaixo para acompanhar os detalhes. Não se esqueçam de criar um usuário para acessar o banco de dados criado.
Instalando pacotes na API
Altere o arquivo requirements/base.txt
e adicione as seguintes linhas:
pymongo==3.6.1
flask-mongoengine==0.9.5
mongoengine==0.15.0
Depois execute o $ pip install -r requirements/base.txt
com o virtualenv ativo workon flask-api-users
Variáveis de ambiente
Adicione as seguintes entradas nas variáveis de ambiente. Tanto no .env
quanto .env-example
.
$ cat .env
DEBUG=True
APP_PORT=5000
FLASK_APP="application.py"
FLASK_ENV="development"
SECRET_KEY="hard-secret-key"
MONGODB_URI="mongodb://localhost:27017/api-users"
MONGODB_URI_TEST="mongodb://localhost:27017/api-user-test"
A entrada MONGODB_URI
será nosso banco de desenvolvimento e MONGODB_URI_TEST
será nosso banco para executar os testes localmente.
Adicionando configurações do Flask
No arquivo config.py
, vamos alterar a class Config
e class TestingConfig
.
Sendo que na class Config
colocaremos uma chave chamada MONGODB_HOST
que será lida automáticamente pelo pacote mongoengine.
class Config:
# adicione após as outras chaves
MONGODB_HOST = getenv('MONGODB_URI')
E a class TestingConfig
será adicionado a mesma chave porém lendo da variável de ambiente MONGODB_URI_TEST
criada no .env
.
class TestingConfig:
# adicione após as outras chaves
MONGODB_HOST = getenv('MONGODB_URI_TEST')
O Flask-Mongoengine
Esse pacote, flask-mongoengine extende as funcionalidades do mongoengine manipulando e gerenciando conexões.
Para isso, crie um arquivo em apps/db.py
e adicione as linhas:
# -*- coding: utf-8 -*-
# Third
from flask_mongoengine import MongoEngine
db = MongoEngine()
Nesse passo estamos criando uma instância do MongoEngine atribuindo a varável db
. Essa variável será utilizada em nossa função construtora create_app
e em nossos modelos.
Adicionando o db ao create_app
De acordo com a documentação, devemos inicializar essa extensão na função create_app
do arquivo apps/__init__.py
. Logo ficará assim:
# -*- coding: utf-8 -*-
from flask import Flask
from config import config
# Realize a importação da função que configura a api
from .api import configure_api
from .db import db
def create_app(config_name):
app = Flask('api-users')
app.config.from_object(config[config_name])
# Configure MongoEngine
db.init_app(app)
# executa a chamada da função de configuração
configure_api(app)
return app
Configurando o conftest.py
Outra importante configuração a ser feita é utilizar o MongoDB em nossos testes. Dentro do nosso arquivo de configuração tests/conftest.py
inclua a seguinte fixture.
@pytest.fixture(scope='function')
def mongo(request, client):
def fin():
print('\n[teardown] disconnect from db')
fin()
Essa fixture, para cada função chamará o método fin()
a qual poderemos limpar as coleções antes de executar um novo teste.
Esse foi um capítulo bem curto. A partir do próximo capítulo vamos colocar em prática o modelo de usuários com testes.
Abraços.
Próximo artigo: Criando e testando o modelo de usuários