Flask em 40 Minutos ou Menos: Iniciando

Uma "breve" explicação de como colocar uma aplicação Flask em produção em 40 minutos. Nessa primeira parte, vamos mostrar como começar um script Flask.

Flask é um micro framework web em Python, muito fácil de ser usado e configurado. Mas o processo inteiro de como começar a aplicação, adicionar rotas e depois disso partir para colocar em produção pode ser uma pequena dor de cabeça. Então veremos como fazer todo o processo.

O VirtualEnv

O primeiro passo de qualquer grande aplicação Python é o VirtualEnv. VirtualEnv é utilizado para separar as bibliotecas do Python entre aplicações -- assim você pode ter a biblioteca X numa versão para um determinado projeto e outra versão para outro projeto. Apenas lembre-se que o VirtualEnv gerencia apenas bibliotecas do Python, portanto não espere que o mesmo controle versões diferentes de MySQL, por exemplo.

VirtualEnv não vai cuidar da versão do MySQL, mas pode controlar a versão do driver para Python.")

Para criar um VirtualEnv:

python -m venv venv

Se ainda estiver usando Python 2, o comando é virtualenv venv.

Depois de executar esse comando, você verá que irá surgir um diretório venv. O último parâmetro é justamente o diretório que será utilizado para armazenar as informações do VirtualEnv e pode ser criado com qualquer nome e em qualquer lugar -- inclusive fora do projeto [#venvwrapper]_.

Alguns pacotes como o VirtualEnvWrapper_ fazem exatamente isso: Os pacotes são instalados em um diretório separado, apenas para VirtualEnvs.

Uma vez criado o VirtualEnv, é preciso ativar o mesmo:

source venv/bin/active

Ou, se estiver usando Windows (sim, você pode rodar os comandos no Windows):

venv/Scripts/activate.bat

Se tudo deu certo, deve aparecer um (venv) no começo do prompt, indicando que o VirtualEnv está ativo.

Apenas note o seguinte: O VirtualEnv foi projetado para ser destruído e reconstruído quantas vezes forem necessárias. Por isso, você não deve adicionar o diretório do VirtualEnv no seu repositório; quem precisar utilizar, que recrie o ambiente.

Além de não colocar o diretório do virtualenv no seu repositório, tente não instalar pacotes Python utilizando o sistema de pacotes da sua distribuição.

O que o venv faz é criar vários scripts para as tarefas relacionadas com o mesmo -- como a ativação do VirtualEnv -- e estes scripts mantém o caminho de onde foram criados. Com isso, se você adicionar o mesmo no seu sistema de controle de versão, somente você poderá usar (a não ser que a outra pessoa tenha exatamente a mesma estrutura de diretórios). Lembre-se: VirtualEnvs existem para conter as bibliotecas que você usa e podem ser destruídos e criados livremente -- E como podem ser criados facilmente, não devem ser incluídos no seu controle de versão -- e se estou me repetindo, é porque muitas pessoas fazem isso, erroneamente.

Requirements.txt

O modo mais fácil de instalar um pacote -- dentro de um VirtualEnv, obviamente -- é utilizando o módulo pip:

python -m pip install flask

Ou, se ainda estiver usando Python 2, pip install -- se realmente preferir, você pode usar pip install mesmo com Python 3, pois ele instala um alias para python -m pip.

Mas, como comentado sobre VirtualEnv, onde a ideia é criar, destruir e criar o ambiente quantas vezes você quiser, ficar passando a lista de pacotes a serem instalados não faz sentido. Por isso, normalmente é gerado um arquivo com a lista de requisitos. Esse arquivo, mais por convenção da comunidade do que por requisito da ferramenta, é o chamado requirements.txt Nesse arquivo você pode colocar a lista de requisitos do seu sistema, incluindo a versão se necessário.

E, caso você tenha requisitos que são necessários somente para desenvolvimento, a convenção diz pra ter um arquivo chamado requirements-dev.txt, cuja a primeira linha é -r requirements.txt.

Por exemplo, como a versão do Flask no momento da escrita desse artigo é a 0.12.2, podemos ter um requirements.txt com o seguinte conteúdo:

flask==0.12.2

... indicando que queremos que seja instala a versão 0.12.2. Existe ainda o operador ~= [#specifiers]_,que significa "versão compatível com a indicada". Assim nos precavemos da possibilidade de ser encontrada uma falha de segurança no Flask, sem precisar sair correndo atrás de todos os requirements.txt com Flask para atualizar a versão e garantimos que, quando sair a versão 0.13 (ou qualquer outra seguinte) que seja incompatível com 0.12.2, nosso código ainda vá funcionar.

Para uma lista de todas as formas de como especificar versões, olhe o PEP 440.

Assim sendo, teremos um requirements.txt com o seguinte conteúdo:

flask~=0.12.2

Mas e para instalar isso? Para isso existe a opção -r do pip, que ao invês de esperar por um nome de pacote para ser instalado, a lista de pacotes é carregada a partir do arquivo indicado. Então para gerar o ambiente:

python -m pip install -r requirements.txt

O Esqueleto de uma Aplicação Flask

Para verificar se tudo está instalado corretamente, você pode utilizar o seguinte arquivo de exemplo:

from flask import Flask

app = Flask(__name__)


@app.route('/')
def index():
   return 'Olá'

Apenas lembre-se de não chamar o nome do arquivo de flask.py, porque esse é o nome do módulo e ao invés de importar o módulo do Flask, ele vai tentar importar o conteúdo do próprio arquivo e, como o objeto Flask não existe, você vai receber um erro de ImportError: cannot import name 'Flask'.

E para executar:

FLASK_APP=main.py flask run

Se você percebeu, a variável FLASK_APP foi definida com o nome main.py; esse é o nome que eu escolhi para a minha aplicação (e o nome do arquivo fonte -- aquele que não pode ser flask.py), mas você pode usar o nome que quiser. Apenas lembre-se de usar esse mesmo nome em FLASK_APP.

Se estiver tudo ok, você deve receber a mensagem

* Serving Flask app "main"
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

E acessando a URL indicada, você deverá ver o "Olá".

Até aqui vimos como instalar e iniciar um projeto Flask básico. No próximo post vou falar da aplicação Flask em si.