Start Python 3 Flask
Start Python 3 Flask
Introdução
Esta postagem do blog descreve minha abordagem atual para iniciar um novo
• Python3
• Ambiente Virtual
• pip
Esta postagem de blog pressupõe o uso do Python 3.4 ou superior, já que essas
versões têm o módulo 'venv' embutido para criar ambientes virtuais e o pip vem
Estrutura
A maneira mais fácil de criar um aplicativo Flask é colocar tudo em um único
arquivo. Esta é a minha abordagem preferida para iniciar um novo projeto do
Flask, já que isso prova o ambiente que está sendo criado.
Comece criando um novo diretório e mudando para esse diretório:
$ mkdir flask_simple_application
$ cd flask_simple_application/
Neste ponto, você provavelmente verá que há pelo menos duas versões do python
disponíveis no seu sistema:
$ python --version
Python 2.7.10
$ python3 --version
Python 3.6.3
Eu recomendo fortemente o uso do Python3 para todos os novos projetos, pois ele
tem vários novos recursos e o suporte para o Python2 (legado do Python) está
terminando em 2020 (countdown clock).
Ambientes Virtuais
Até mesmo nos projetos mais simples, criar um ambiente virtual é uma ótima
ideia. Ambientes virtuais criam um ambiente isolado para cada projeto, o que
significa que cada projeto pode ter suas próprias dependências (ou seja, versão do
interpretador Python, pacotes python importados, etc.).
Os ambientes virtuais realmente se tornaram benéficos para mim quando eu estava
trabalhando em dois projetos simultâneos:
Este é o comando para criar um novo ambiente virtual, no qual o diretório para
criar o ambiente virtual é especificado como "venv".
Este comando criou um novo diretório chamado "venv", que contém os seguintes
itens para manter este projeto isolado dos outros projetos em seu sistema:
Para começar a usar o ambiente virtual que foi criado, ele precisa ser ativado:
$ source venv/bin/activate
(venv) $
Depois de ativar o ambiente virtual, o nome do ambiente virtual é exibido em seu
prompt de comando (o "(venv)" à esquerda do prompt).
Este comando instala o pacote Flask mais todas as suas dependências (ou seja,
outros pacotes necessários ao Flask). Veja um exemplo de todos os pacotes que
foram instalados:
$ pip freeze
click==6.7
Flask==0.12.2
itsdangerous==0.24
Jinja2==2.10
MarkupSafe==1.0
Werkzeug==0.14.1
É uma boa ideia salvar os pacotes (incluindo números de versão) que estão sendo
usados no projeto:
$ pip freeze > requirements.txt
Isso pode ser realmente benéfico se você ou outra pessoa estiver iniciando com
este projeto e quiser instalar rapidamente todos esses pacotes com "pip install -r
requirements.txt".
Escrevendo Código Python
Agora é hora de realmente escrever algum código Python! No diretório de nível
superior criado, crie um novo arquivo chamado app.py com o seguinte conteúdo:
1 from flask import Flask
2
3 app = Flask(__name__)
4
5 @app.route('/')
6 def index():
return "Hello World!"
7
Este arquivo cria uma nova instância do aplicativo Flask e define uma única rota
que retorna a declaração “Hello World!”. Este é o aplicativo Flask mais básico,
Primeiro, você precisa especificar onde o aplicativo Flask está definido (através da
variável de ambiente FLASK_APP). Então, você pode executar seu aplicativo
Flask com "flask run":
(venv) $ export FLASK_APP=app.py
(venv) $ flask run
* Serving Flask app "app"
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
Conclusão
Esta postagem do blog forneceu as etapas que segui para criar um novo aplicativo
do Flask usando o Python 3. Em uma postagem de blog futura, descreverei como
gosto de estruturar um aplicativo do Flask.
Structuring a Flask Project
FEBRUARY 27, 2018 / [email protected] / 0 COMMENTS
HTTPS://WWW .PATRICKSOFTW AREBLOG.COM/STRU CTURING-A-FLASK-PROJECT/
Introdução
Factory.
Para referência, o projeto que criei como parte da publicação desta
postagem do blog está disponível no GitLab:
Flask User Management Example.
(https://gitlab.com/patkennedy79/flask_user_management_example)
Blueprints
Blueprints permiti que você organize de forma limpa o código-fonte do seu
aplicativo Flask. Cada Blueprint encapsula uma parte significativa da
funcionalidade em seu aplicativo. Por exemplo, eu gosto de ter um Blueprint
separado para lidar com o gerenciamento de usuários de um aplicativo Flask.
Eu gosto de criar um pacote separado (ou seja, um diretório que inclua o arquivo
__init__.py) para cada Blueprint.
Por exemplo, aqui está a estrutura do Flask User Management exemplo que
contém dois Blueprints (recipes and users “receitas e usuários”):
(venv) $ tree -L 5
.
├── README.md
├── instance
├── main.py
├── project
│ ├── __init__.py
│ ├── models.py
│ ├── recipes
│ │ ├── __init__.py
│ │ ├── routes.py
│ │ └── templates
│ │ └── recipes
│ │ └── index.html
│ ├── templates
│ │ └── base.html
│ └── users
│ ├── __init__.py
│ ├── forms.py
│ ├── routes.py
│ └── templates
│ └── users
│ ├── login.html
│ ├── profile.html
│ └── register.html
├── requirements.txt
└── venv
├── bin
│ ├── activate
| ├── ...
Blueprints.
Fábrica de Aplicação
A inicialização de um projeto do Flask requer os seguintes passos:
Conclusão
Este post de blog descreveu como usar Blueprints e uma função Application
Factory para ajudar a estruturar um projeto Flask.
➔Os blueprints fornecem uma ótima ferramenta para organizar seu projeto em
grandes partes da funcionalidade.
Juntas, essas são as duas ideias principais que uso para estruturar um projeto do
Flask.
Testando uma aplicação de
flask usando pytest
MAY 2, 2018 / [email protected] /
HTTPS://W WW .PATR ICKSOF TW AREBLOG.COM/ TES TING- A-FL ASK- APPL IC ATION-US ING-P YTES T/
Introdução
Recentemente comecei a usar pytest e é um framework de teste incrível para
python! Depois de ler o livro de Brian Okken intitulado “Python Testing with
pytest“, eu estava convencido de que queria começar a usar o pytest em vez do
módulo de teste unitário integrado que vem com o python. Nesta postagem do
blog, explicarei como testar um aplicativo do Flask usando o pytest.
pytest é uma estrutura de teste para python que você usa para gravar casos de
teste, mas também para executar os casos de teste. Depois de configurar sua
estrutura de teste, o pytest facilita muito a gravação de testes e oferece muita
flexibilidade para executar os testes. Usando o pytest, descobri que isso satisfaz
os principais aspectos de um bom ambiente de teste:
Para referência, o aplicativo Flask referenciado nesta postagem de blog pode ser
encontrado no GitLab:
https://gitlab.com/patkennedy79/flask_user_management_example
Estrutura
Em um projeto do Flask, gosto de manter todos os casos de teste em uma pasta
separada de "testes" que esteja no mesmo nível dos arquivos do aplicativo:
$ tree -L 3
├── main.py
├── project
├── requirements.txt
├── tests
│ ├── conftest.py
│ ├── functional
│ │ ├── __init__.py
│ │ └── test_users.py
│ ├── pytest.ini
│ └── unit
│ ├── __init__.py
│ └── test_models.py
└── venv
4 def test_new_user():
5 """
Esse teste cria uma nova instância da classe User e verifica se o usuário foi
inicializado corretamente. Mais uma vez, estou roubando diretamente do livro de
Brian Okken (Python Testing with pytest) com o comentário para cada teste
unitário (GIVEN, WHEN, THEN sequence). Eu realmente gosto desta estrutura de
comentários para identificar o que o caso de teste está fazendo. Isso pode parecer
muito trabalho extra, mas realmente descobri que casos de teste bem comentados
facilitam muito a manutenção deles.
Para executar este caso de teste, navegue até o diretório de nível superior do seu
projeto e execute:
$ pytest
É isso aí! O pytest descobrirá todos os casos de teste para você e executará esses
Fixtures
Como alguém que trabalhou com o tipo xUnit de estruturas de teste, estou
familiarizado com a ideia de:
• Setup()
• …run the test case…
• Teardown()
Essa estrutura parece muito familiar, mas eu passei a preferir o conceito de
fixtures em pytest. As fixtures permitem uma flexibilidade maior do que o Setup ()
/ Teadown (), já que você pode fazer com que seu equipamento seja executado
com um escopo diferente:
• function
• class
• module
• session
Para essa situação em que uma única classe (User) está sendo testada, uma boa
opção para um fixture seria criar um novo User. Esse novo usuário pode ser criado
apenas uma vez e usado várias vezes em diferentes casos de teste.
5 @pytest.fixture(scope='module')
6 def new_user():
7 user = User('[email protected]', 'FlaskIsAwesome')
8 return user
Este equipamento cria uma instância da classe User e a retorna para casos de teste
dentro do escopo do módulo a ser usado. Para usar este equipamento, altere o caso
de teste original para:
1 def test_new_user(new_user):
2 """
collected 3 items
tests/unit/test_models.py
SETUP M new_user
TEARDOWN M new_user
Essa saída é ótima, porque mostra que o fixture (new_user) é executado antes de
Os testes funcionais que vou criar estão testando como um usuário pode se
registrar, fazer login e sair. Para poder testar essa funcionalidade, precisamos de
um aplicativo Flask totalmente funcional em execução com um banco de dados. É
aqui que as fixture realmente brilham, na minha opinião ...
2 def test_client():
flask_app = create_app('flask_test.cfg')
3
4
# Flask provides a way to test your application by exposing the Werkzeug
5
test Client
6
# and handling the context locals for you.
7
testing_client = flask_app.test_client()
8
9
# Establish an application context before running the tests.
10
ctx = flask_app.app_context()
11 ctx.push()
12
14
15 ctx.pop()
Configuração de teste
3 # Enable the TESTING flag to disable the error catching during request
4 handling
5 # so that you get better error reports when performing test requests
TESTING = True
7
8
# Disable CSRF tokens in the Forms (only valid for testing purposes!)
9
WTF_CSRF_ENABLED = False
5
# Insert user data
6 user1 = User(email='[email protected]', plaintext_password=
7 'FlaskIsAwesome')
9 'PaSsWoRd')
db.session.add(user1)
10
db.session.add(user2)
11
12
# Commit the changes for the users
13
db.session.commit()
14
15
yield db # this is where the testing happens!
16
17
db.drop_all()
Esta fixture cria o banco de dados (db.create_all ()) e adiciona dois usuários ao
banco de dados para usar durante o teste funcional. Mais uma vez, há uma
instrução "yield db" para permitir que os testes de função sejam executados ao
usar essa instância de banco de dados. Depois que todos os testes funcionais são
executados, o banco de dados é destruído (db.drop_all ()).
Agora que essas fixtures estão no lugar, é hora de escrever um teste funcional
(em… / tests / functional / test_users):
def test_home_page(test_client):
1
"""
2
GIVEN a Flask application
3
WHEN the '/' page is requested (GET)
4
THEN check the response is valid
5 """
6 response = test_client.get('/')
11
Esse teste funcional está solicitando a home page (no URL base de '/') e
verificando se o código de status retornado é válido (200) e o html retornado
contém as principais instruções de uma home page.
Esse teste funcional usa o cliente de teste para a solicitação GET, portanto, o
equipamento ‘test_client’ é especificado como um argumento. Como esse teste
funcional não está usando o banco de dados, o equipamento "init_database" não é
especificado.
collected 1 item
tests/functional/test_users.py
SETUP S test_client
TEARDOWN S test_client
Aqui está um caso de teste mais complexo que verifica o login e, em seguida,
efetua logout:
1
def test_valid_login_logout(test_client, init_database):
2
"""
3
GIVEN a Flask application
4
WHEN the '/login' page is posted to (POST)
5
THEN check the response is valid
6
"""
7 response = test_client.post('/login',
8 data=dict(email='[email protected]', passw
9 'FlaskIsAwesome'),
10 follow_redirects=True)
18 """
"""
22
response = test_client.get('/logout', follow_redirects=True)
23
assert response.status_code == 200
24
assert b"Goodbye!" in response.data
25
assert b"Flask User Management" in response.data
26
assert b"Logout" not in response.data
27
assert b"Login" in response.data
28 assert b"Register" in response.data
29
Como esse teste funcional está efetuando login em um usuário, é necessário usar o
banco de dados para acessar se o usuário especificado for um usuário registrado.
Portanto, os fixtures "test_client" e "init_database" são especificados.
Para ilustrar o uso desses fixtures, aqui está o comando para executar todos os
testes funcionais com o uso dos fixtures explicados:
$ pytest --setup-show tests/functional/
collected 7 items
tests/functional/test_users.py
SETUP S test_client
SETUP S init_database
init_database, test_client).
test_client).
test_client).
init_database, test_client).
TEARDOWN S init_database
TEARDOWN S test_client
Para finalizar o uso do pytest, aqui está o meu comando favorito para executar a
unidade e os testes funcionais:
$ pytest -v
Conclusão
Sim, o pytest é incrível! Esta postagem do blog mostra como usar o pytest para
testar um aplicativo Flask, mas ele apenas reflete a superfície do poder total do
pytest. Para continuar aprendendo sobre pytest, eu recomendo altamente o livro de
Brian Okken: Python Testing with pytest.