Julio Biason
6 years ago
1 changed files with 210 additions and 0 deletions
@ -0,0 +1,210 @@
|
||||
+++ |
||||
|
||||
title = "Flask em 40 Minutos ou Menos: Iniciando" |
||||
date = 2017-09-25 |
||||
|
||||
category = "code" |
||||
|
||||
[taxonomies] |
||||
tags = ["python", "flask", "uwsgi", "pt-br"] |
||||
|
||||
+++ |
||||
|
||||
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. |
||||
|
||||
<!-- more --> |
||||
|
||||
|
||||
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. |
||||
|
||||
{% note() %} |
||||
VirtualEnv não vai cuidar da versão do MySQL, mas pode controlar a versão do driver para Python.") |
||||
{% end %} |
||||
|
||||
Para criar um VirtualEnv: |
||||
|
||||
``` |
||||
python -m venv venv |
||||
``` |
||||
|
||||
{% note() %} |
||||
Se ainda estiver usando Python 2, o comando é `virtualenv venv`. |
||||
{% end %} |
||||
|
||||
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]_. |
||||
|
||||
{% note() %} |
||||
Alguns pacotes como o [VirtualEnvWrapper](http://virtualenvwrapper.readthedocs.io/en/latest/)_ |
||||
fazem exatamente isso: Os pacotes são instalados em um diretório separado, |
||||
apenas para VirtualEnvs. |
||||
{% end %} |
||||
|
||||
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. |
||||
|
||||
{% note() %} |
||||
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. |
||||
{% end %} |
||||
|
||||
{% note() %} |
||||
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. |
||||
{% end %} |
||||
|
||||
|
||||
## 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 |
||||
``` |
||||
|
||||
{% note() %} |
||||
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`. |
||||
{% end %} |
||||
|
||||
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. |
||||
|
||||
{% note() %} |
||||
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`. |
||||
{% end %} |
||||
|
||||
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. |
||||
|
||||
{% note() %} |
||||
Para uma lista de todas as formas de como especificar |
||||
versões, olhe o [PEP 440](https://www.python.org/dev/peps/pep-0440/#version-specifiers). |
||||
{% end %} |
||||
|
||||
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á' |
||||
``` |
||||
|
||||
{% note() %} |
||||
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'`. |
||||
{% end %} |
||||
|
||||
E para executar: |
||||
|
||||
``` |
||||
FLASK_APP=main.py flask run |
||||
``` |
||||
|
||||
{% note() %} |
||||
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`. |
||||
{% end%} |
||||
|
||||
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. |
Loading…
Reference in new issue