Como usar plantas para organizar seus aplicativos Flask


O Flask é um microframework simples e fácil de usar para Python que pode ajudá-lo a construir aplicações web escaláveis e seguras.

Às vezes, você encontrará desenvolvedores despejando toda a sua lógica em um único arquivo chamado app.py. Você encontrará muitos tutoriais que seguem o mesmo padrão. Mas não é uma boa prática para um aplicativo de grande escala.

Ao fazer isso, você está claramente violando o Princípio da Responsabilidade Única, segundo o qual cada parte do seu aplicativo deve lidar com apenas uma responsabilidade.

Se você já trabalhou com o Django, você pode ter encontrado seu projeto dividido em diferentes módulos. No Flask, também, você pode organizar suas aplicações usando Blueprints, um conceito embutido no Flask semelhante aos módulos Python. 

Como é uma aplicação de frasco?

Se você seguir a documentação do Flask para criar uma aplicação mínima, sua estrutura de projeto será semelhante a esta:

/myapp
├── /templates
├── /static
└── app.py

A pasta não parece tão limpa? Tudo o que você tem é um arquivo app.py onde você tem toda a sua lógica para o aplicativo, uma pasta de modelos para armazenar seus arquivos HTML e uma pasta estática para armazenar seus arquivos estáticos.

Vejamos o app.py arquivo:

from flask import Flask


app = Flask(__name__)

# Some Models Here


# Routes related to core functionalities


# Routes related to Profile Page


# Routes related to Products Page


# Routes related to Blog Page


# Routes related to Admin Page

if __name__ == '__main__':
    app.run(debug=True)

Isso não parece confuso (imaginando que você criou um aplicativo de grande escala)? Você tem todos os seus modelos e rotas diferentes dentro do mesmo arquivo espalhados aqui e ali.

Como os planos resolvem o problema?

Agora, é aqui que o Flask Blueprints entra em cena. Os esquemas ajudam a estruturar seu aplicativo organizando a lógica em subdiretórios. Além disso, você pode armazenar seus modelos e arquivos estáticos junto com a lógica no mesmo subdiretório.

Assim, com Blueprints agora seu mesmo aplicativo terá esta aparência:

/blueprint-tutorial
├── /myapp_with_blueprints
│   ├── __init__.py
│   ├── /admin
│   │   ├── /templates
│   │   ├── /static
│   │   └── routes.py
│   ├── /core
│   │   ├── /templates
│   │   ├── /static
│   │   └── routes.py
│   ├── /products
│   │   ├── /templates
│   │   ├── /static
│   │   └── routes.py
│   └── /profile
|       ├── /templates
|       ├── /static
|       └── routes.py		
├── app.py
├── /static
└── /templates

Agora você pode ver que você tem uma separação clara de preocupações. A lógica relacionada a admin reside dentro da pasta admin, a lógica relacionada a produtos reside dentro da pasta de produtos e assim por diante.

Além disso, também separamos os modelos e arquivos estáticos nos subdiretórios onde eles são necessários, para que os arquivos irrelevantes não sejam carregados ao ir para uma página que não os exija.

Como usar Blueprints

Agora que você entende quais problemas o Blueprints resolve, vamos ver como podemos usar o Blueprints em nossos aplicativos.

Como definir um plano

Vamos definir nosso primeiro plano para a funcionalidade admin dentro do arquivo admin/routes.py:

from flask import Blueprint


# Defining a blueprint
admin_bp = Blueprint(
    'admin_bp', __name__,
    template_folder='templates',
    static_folder='static'
)

Como o Blueprint é um conceito integrado do Flask, você pode importá-lo da biblioteca do Flask. Ao criar o objeto da classe Blueprint, o primeiro parâmetro é o nome que você deseja dar ao seu Blueprint. Esse nome será usado posteriormente para roteamento interno (veremos abaixo).

O segundo parâmetro é o nome do pacote Blueprint, geralmente __name__. Isso ajuda a localizar o root_path para o projeto.

O terceiro e quarto parâmetros passados são argumentos de palavra-chave opcionais. Ao definir os parâmetros template_folder e static_folder, você especifica que usará modelos específicos do blueprint e arquivos estáticos.

Como definir rotas com plantas

Agora que você criou um plano para a funcionalidade relacionada ao administrador, você pode usá-lo ao criar rotas para os administradores.

from flask import Blueprint


# Defining a blueprint
admin_bp = Blueprint(
    'admin_bp', __name__,
    template_folder='templates',
    static_folder='static'
)

@admin_bp.route('/admin')   # Focus here
def admin_home():
    return "Hello Admin!"

No trecho acima, concentre-se na linha onde a rota está definida. Em vez do habitual @app.route('... '), utilizámos @admin_bp.route('... «). É assim que você vincula uma rota a um esquema específico.

Como registrar seus planos

Agora você tem um plano e uma rota registrados nele. Mas, seu aplicativo saberá automaticamente sobre esse modelo?

Então, vamos fazer isso. No arquivo __init__.py, criaremos um aplicativo Flask e registraremos nossos projetos lá:

from flask import Flask


app = Flask(__name__)

from .admin import routes

# Registering blueprints
app.register_blueprint(admin.admin_bp)

Para registrar o blueprint, usamos o método register_blueprint() e passamos o nome do blueprint. Além disso, você pode passar outros parâmetros para o método para obter mais personalização. Um deles é url_prefix que você pode exigir.

app.register_blueprint(admin.admin_bp, url_prefix='/admin')

Da mesma forma, você pode registrar o resto de seus projetos, se tiver mais.

Roteamento de modelos com plantas

Sem Blueprints, para criar links em seus modelos, você usaria algo semelhante ao abaixo:

<a href="{{ url_for('admin_home') }}">My Link</a>

Mas com os planos em vigor, agora você pode definir seus links como:

<a href="{{ url_for('admin_bp.admin_home') }}">My Link</a>

A admin_bp que usamos acima é o nome que demos ao nosso plano de roteamento interno durante a criação do objeto.

Para imprimir o nome do modelo Jinja2 ao qual a página atual pertence, você pode usar {{request.blueprint}}.

Conclusão

Blueprint é uma ferramenta incrível para organizar e estruturar suas aplicações Flask.

Neste artigo, você aprendeu o que os blueprints têm a oferecer e como usá-los em suas aplicações Flask.

Obrigado pela leitura!

Você pode me seguir no Twitter.