Construindo a estrutura mínima do projeto

Vamos construir a estrutura mínima para um projeto python com Flask

Crie a pasta do seu projeto

mkdir ./formula_magica_app
cd ./formula_magica_app

Crie um Ambiente virtual Python para seu projeto.

python3.6 -m venv venv
source venv/bin/activate

{% note info %} Não precisa criar o Ambiente virtual para um projeto em Docker. Eu apenas o Faço para facilitar o pip freeze {% endnote %}

Neste ponto gosto de criar o arquivo base de requisitos do Python já com a dependência do Flask instalada

pip install flask
pip install gevent
pip freeze >requirements.txt

{% note primary %}

Sobre o Flask

Para projetos rápidos e de aprendizado gosto de usar o Framework Flask devido a sua facilidade de uso e por ser “direta e reta”.

É um pacote extremamente leve para rodar, sem uma estrutura de diretório complexa e ao mesmo tempo possui muitas extensões e uma comunidade forte.

Outra framework muito utilizada é o Django e confesso que para um projeto bem delimitado ele oferece ferramentas melhores integradas a framework, já vem com um painel admin, bibliotecas para bancos de dados, uma estrutura pré-definida de diretório. Mas a simplicidade é exatamente a beleza do Flask, a comunidade diz que o Flask é uma framework “unopinionated”, ou seja, ele te permite decidir como implementar sua aplicação sem ficar no meio do caminho.

Existem diversas outras Web Frameworks para python e você pode conferi-las aqui. {% endnote %}

Criando os arquivos iniciais do Projeto

Vamos criar um arquivo de configuração para a nossa aplicação na pasta do projeto já com classes que representam ambientes de produção e desenvolvimento.

class Config(object): 
    pass 
 
class ProdConfig(Config): 
    pass 
 
class DevConfig(Config): 
    DEBUG = True 

E agora o arquivo da aplicação.

from gevent.pywsgi import WSGIServer
from flask import Flask 
from config import DevConfig 
 
app = Flask(__name__) 
app.config.from_object(DevConfig) 
 
@app.route('/') 
def home(): 
    return '<h1>Olá mundo pequeno!</h1>' 
 
if __name__ == '__main__': 
    http_server = WSGIServer(('', 5000), app)
    http_server.serve_forever() 

Já já vamos colocar esse código para rodar, aguenta aí.

Configurando o Docker

Crie um Dockerfile na pasta do projeto

FROM python:3.6.5
# Criando uma pasta para a aplicação
WORKDIR /app

# Copiando arquivos da pasta local para dentro do Docker
ADD . /app

# Instalando as dependências dentro do Docker
RUN pip install -r requirements.txt

EXPOSE 5000

#Rodando a aplicação
CMD ["python", "main.py"]

Nesta altura do campeonato, sua estrutura de diretório deve ser assim:

upload successful

{% note primary %}

Por que Docker?

Nossa aplicação precisará rodar a aplicação Web, mas não para por ai. No fim deste artigo também precisaremos de um sistema de banco de dados, de um sistema de autenticação e projetos reais muitas vezes rodam mais de um servidor web, enfim, você pegou a idéia.

Dado essa pilha (“stack”) de aplicações, uma forma simples de defini-lá e executá-la e através de sistemas de containers. E é ai que o Docker entra na jogada.

Com o Docker, você define como instalar sua aplicação e depois pode facilmente compartilhar o script com seu time e até mesmo subir para produção de forma rápida e ligeira. {% endnote %}

Rodando a Aplicação

Bora colocar a aplicação para rodar.

Construa sua imagem do Docker

docker build -t formula_magica .

Rode o container

docker run --name fm -p 5000:5000 formula_magica 

Agora só acessar sua aplicação em: http://localhost:5000 {% note info %}

Diquinha para facilitar o Docker Build

Depois de rodar várias e várias vezes o comando, tu notará que o docker build reinstala toda vez os requirements.txt do pip.

Para evitar isso eu gero uma tag local após saber que não modificarei mais o requirements.txt

docker tag formula_magica local/formula_magica

E modifico o Dockerfile para isso

FROM local/formula_magica
# Criando uma pasta para a aplicação
WORKDIR /app

# Copiando arquivos da pasta local para dentro do Docker
ADD . /app

# Instalando as dependências dentro do Docker
RUN pip install -r requirements.txt

EXPOSE 5000

#Rodando a aplicação
CMD ["python", "main.py"]

Facilita muito o serviço! {% endnote %}