O que são os Flask Blueprints, exatamente?


180

Eu tenho lido a documentação Flask oficial em modelos e até mesmo um ou dois posts sobre usá-los.

Até os usei no meu aplicativo Web, mas não entendo completamente o que são ou como se encaixam no meu aplicativo como um todo. Como é semelhante a uma instância do meu aplicativo, mas não exatamente? A documentação é abrangente, mas busco uma explicação leiga ou uma analogia esclarecedora para desencadear isso para mim. Fiquei bastante perplexo quando um colega me pediu para explicar um plano do Flask para eles que eu decidi perguntar aqui.

Respostas:


287

Um blueprint é um modelo para gerar uma "seção" de um aplicativo da web. Você pode pensar nisso como um molde:

Um molde de medalhão com um medalhão de ouro recém-removido

Você pode pegar o modelo e aplicá-lo ao seu aplicativo em vários lugares. Cada vez que você o aplica, o blueprint cria uma nova versão de sua estrutura no reboco do seu aplicativo.

# An example
from flask import Blueprint

tree_mold = Blueprint("mold", __name__)

@tree_mold.route("/leaves")
def leaves():
    return "This tree has leaves"

@tree_mold.route("/roots")
def roots():
    return "And roots as well"

@tree_mold.route("/rings")
@tree_mold.route("/rings/<int:year>")
def rings(year=None):
    return "Looking at the rings for {year}".format(year=year)

Esse é um molde simples para trabalhar com árvores - diz que qualquer aplicativo que lide com árvores deve fornecer acesso a suas folhas, raízes e anéis (por ano). Por si só, é uma concha oca - não pode rotear, não pode responder até que seja impressa em um aplicativo:

from tree_workshop import tree_mold

app.register_blueprint(tree_mold, url_prefix="/oak")
app.register_blueprint(tree_mold, url_prefix="/fir")
app.register_blueprint(tree_mold, url_prefix="/ash")

Uma vez criado, ele pode ser "impresso" no aplicativo usando a register_blueprintfunção - isso "impressiona" o molde do blueprint no aplicativo nos locais especificados por url_prefix.


5
Aqui está um bom artigo para a estrutura de aplicativos usando blueprints. exploreflask.com/en/latest/blueprints.html
Devasish

5
Eu ainda estou confuso. Isso significa oak/leavese fir\leavesapontará para o mesmo código? Além disso, qual é o propósito da corda moldemBlueprint("mold", __name__)
Codevalley

8
Sim, ambos oak/leavese fir/leavesserão tratados por def leaves. "mold"é o nome do blueprint e é usado para desambiguação quando se refere a rotas (por exemplo, someBlueprint.routeNamevs. anotherBlueprint.routeName).
Sean Vieira

2
Como posso acessar o url_prefixna função? Diga, para verificar se é carvalho ou abeto? tree_mold.url_prefixme dá um #None
Mellkor 12/0218

3
@Ellkor - basta usar url_for('.relative_route_name')(observe o ponto à esquerda). Por exemplo, url_for('.roots')fornecerá uma URL com escopo correto em cada um dos pontos montados automaticamente.
Sean Vieira

6

Como apontado em um comentário de @Devasish , este artigo fornece uma boa resposta:

http://exploreflask.com/en/latest/blueprints.html

Citando o artigo:

Um exemplo disso seria o Facebook. Se o Facebook usou o Flask, ele pode ter modelos para as páginas estáticas (por exemplo, página inicial desconectada, registro, sobre etc.), painel (por exemplo, o feed de notícias), perfis (/ robert / about e / robert / photos), configurações (/ settings / security e / settings / privacy) e muito mais. Todos esses componentes compartilham um layout e estilos gerais, mas cada um tem seu próprio layout

Esta é uma interpretação muito boa, especialmente a parte "se o Facebook usou o Flask". Isso nos dá uma situação concreta para visualizar como o Blueprint realmente funciona.


3

Eu também me deparei com isso e fiquei confuso depois de ler algumas das fontes de documentação. No começo, eu pensei que era como o estilo de implementação C # / Java, onde você define algumas coisas, mas não precisa se preocupar em defini-lo até mais tarde. No entanto, eu tropecei nesta página, que a coloca em termos muito leigos (e hilariantes eventos atuais).https://hackersandslackers.com/flask-blueprints/

Essencialmente, um benefício mencionado no link e que me fornece uma idéia clara do uso no mundo real é que eu posso efetivamente organizar / dividir logicamente o aplicativo em várias partes que precisam apenas se preocupar com seus próprios assuntos. Portanto, ele fornece algum encapsulamento projetado.

Editar: atualmente estou usando para segmentar meu código de aplicativos da web. Também foi uma boa decisão, porque achei que o designer-chefe quer fazer a interface no Vue.js. O qual eu ainda não usei, mas analisar os arquivos do projeto pareceria muito mais confuso e provavelmente forneceria muitas propensões a colisões de nomes.


0

Para projetos maiores, todo o seu código não deve estar no mesmo arquivo. Em vez disso, você pode segmentar ou dividir códigos maiores em arquivos separados, principalmente com base na funcionalidade. Como tijolos formando uma parede.

Espero que isso tenha ajudado. Por se tratar de uma questão teórica, não há códigos.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.