Cosa sono esattamente i progetti di pallone?


180

Ho ho letto la documentazione ufficiale Flask su Blueprints e anche uno o due post di blog su come utilizzarle.

Li ho persino usati nella mia app Web, ma non capisco perfettamente cosa siano o come si adattino alla mia app nel suo insieme. In che modo è simile a un'istanza della mia app ma non del tutto? La documentazione è completa ma cerco una spiegazione profana o un'analogia illuminante per stimolarla. Ero abbastanza perplesso quando un collega mi ha chiesto di spiegare loro un progetto di pallone che ho scelto di chiedere qui.

Risposte:


287

Un progetto è un modello per generare una "sezione" di un'applicazione Web. Puoi pensarlo come uno stampo:

Uno stampo medaglione con un medaglione d'oro rimosso di recente da esso

Puoi prendere il progetto e applicarlo alla tua domanda in diversi luoghi. Ogni volta che lo applichi, il progetto creerà una nuova versione della sua struttura nell'intonaco della tua applicazione.

# 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)

Questo è uno stampo semplice per lavorare con gli alberi - dice che qualsiasi applicazione che si occupa di alberi dovrebbe fornire accesso alle sue foglie, alle sue radici e ai suoi anelli (per anno). Di per sé, è una shell vuota - non può instradare, non può rispondere, fino a quando non viene impressionato da un'applicazione:

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")

Una volta creato, può essere "impressionato" sull'applicazione utilizzando la register_blueprintfunzione - questo "impressiona" lo stampo del progetto sull'applicazione nelle posizioni specificate da url_prefix.


5
Ecco un bell'articolo per la struttura dell'applicazione usando i progetti. exploreflask.com/en/latest/blueprints.html
Devasish

5
Sono ancora confuso. Significa oak/leavese fir\leavespunterà allo stesso codice? Inoltre, qual è lo scopo della stringa moldinBlueprint("mold", __name__)
Codevalley

8
Sì, entrambi oak/leavese fir/leavessaranno gestiti da def leaves. "mold"è il nome del progetto e viene utilizzato per chiarimenti quando si fa riferimento a percorsi (ad es. someBlueprint.routeNamevs. anotherBlueprint.routeName).
Sean Vieira,

2
Come posso accedere url_prefixa nella funzione? Per esempio, per controllare se è quercia o abete? tree_mold.url_prefixmi dà unNone
Mellkor il

3
@Mellkor - usa semplicemente url_for('.relative_route_name')(nota il punto iniziale). Ad esempio, url_for('.roots')fornirà automaticamente un URL con ambito corretto in ciascuno dei punti montati.
Sean Vieira,

6

Come sottolineato in un commento di @Devasish , questo articolo fornisce una buona risposta:

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

Citando l'articolo:

Un esempio di questo sarebbe Facebook. Se Facebook usasse Flask, potrebbe avere progetti per le pagine statiche (es. Home disconnessa, registro, informazioni su, ecc.), Il dashboard (ovvero il feed di notizie), i profili (/ robert / about e / robert / photos), impostazioni (/ settings / security e / settings / privacy) e molti altri. Tutti questi componenti condividono un layout e stili generali, ma ognuno ha anche un proprio layout

Questa è un'ottima interpretazione, in particolare la parte "se Facebook usasse Flask". Ci dà una situazione concreta per visualizzare come funziona realmente Blueprint.


3

Anch'io mi sono imbattuto in questo me stesso ed ero confuso dopo aver letto alcune delle fonti di documentazione. All'inizio ho pensato che fosse come lo stile di implementazione C # / Java in cui definisci alcune cose ma non devi preoccuparti di definirle fino a dopo. Tuttavia, ho inciampato in questa pagina che la pone in termini molto molto profani (e abbastanza esilaranti eventi di oggi). https://hackersandslackers.com/flask-blueprints/

Essenzialmente uno dei vantaggi che è menzionato nel link e mi dà una chiara idea del suo utilizzo nel mondo reale è che posso organizzare / dividere in modo logico l'app in diverse parti che devono solo occuparsi dei propri affari. Quindi fornisce un incapsulamento progettato.

Modifica: attualmente lo sto usando per segmentare il mio codice webapps. È stata anche una buona decisione perché ho scoperto che il lead designer voleva realizzare il frontend in Vue.js. Che non ho ancora usato ma guardando i suoi file di progetto sembrerebbe molto più disordinato e probabilmente fornirà molti nomi inclini alla collisione.


0

Per progetti più grandi, tutto il tuo codice non dovrebbe essere nello stesso file. Puoi invece segmentare o dividere codici più grandi in file separati, principalmente in base alla funzionalità. Come mattoni che formano un muro.

Spero che questo abbia aiutato. Poiché questa è una domanda teorica, non pubblicare codici.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.