Flask em 40 Minutos ou Menos: Iniciando
2017-09-25 #python #flask #uwsgi #companion postUma "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.