Lucas Simon

Web Developer. lucassrod@gmail.com

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.

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