2012-02-22 12 views
71

Sto costruendo la mia prima app Flask e non riesco a trovare un buon modo per organizzare la mia applicazione in Python. Non voglio avere tutto in un singolo file .py come nel loro esempio. Mi piacerebbe avere ciascuna parte della mia app in un modulo separato. Quale sarebbe un buon modo per organizzare le cose?Come organizzare un'applicazione Flask relativamente grande?

+3

Mi piace molto il layout spiegato qui: http://flask.pocoo.org/docs/patterns/packages/ – obmarg

+1

Qui stanno utilizzando le importazioni circolari che vorrei evitare. – daniels

+0

Vero, ma non penso che sia evitabile se si desidera utilizzare l'app.route decorator. – obmarg

risposta

78

ho creato un progetto Flask boilerplate chiamato "Fbone", non esitate a check it out e :) forchetta

Fbone (Flask ossea) è un pallone (Python microframework) applicazione template/bootstrap/boilerplate.

Panoramica

  • ben progettato per il grande progetto che utilizza progetto.
  • Integrazione con il framework di frontend più caldo: jQuery/html5boilerplate/bootstrap.
  • Sostenuto dal famoso SQLalchemy.
  • Implementare in modo ingannevole "ricordami" con il login di una boccetta.
  • Gestire i moduli Web con il flask-wtform.
  • Test unitario con test del pallone e naso.
  • Distribuire facilmente tramite fabric e mod_wsgi (esempio incluso).
  • i18n dal pallone-babele

btw, ho appena trovato questo wiki sulla costruzione di un grande progetto con la boccetta utile, pls controllare!

+1

stamattina impressionante, buon lavoro! –

+0

Davvero così. Grazie! – jdsantiagojr

+0

Prima di eseguire 'fab d' come descritto nel README, è necessario attivare l'ambiente virtuale con 'source env/bin/activate' – JRG

20

Flask 0.7 attrezzi Blueprints. Sono ottimi per l'utilizzo del decoratore route senza importare l'oggetto dell'applicazione principale.

+1

In che modo un progetto è diverso da un modulo? – dcolish

+1

Tecnicamente, un progetto è un'istanza della classe Blueprint. Possono estendersi su uno o più moduli o più modelli possono coesistere nello stesso modulo. C'è un po 'di magia dietro le quinte per capire il modulo o il pacchetto di un modello, per trovare le sue cartelle 'templates' e' static'. –

+1

Ho integrato i progetti nel progetto del mio fiasco, vedi la mia risposta. – imwilsonxu

12

Sto lavorando ad un (grande standard) progetto Flask (5000 linee di codice Python ed è solo parzialmente rifinito). Il cliente vuole il progetto per essere modulare, così ho preso questa suddetto approccio:

mia struttura di cartelle simile a questa:

├── __init__.py 
├── modules.yml 
├── config 
├── controllers 
│ └── ... 
├── lib: Common functions I use often 
│ └── ... 
├── models 
│ └── ... 
├── static: All static files 
│ ├── css 
│ ├── img 
│ └── js 
└── templates: Jinja2 templates 
    └── ... 

In modules.yml ho definire il mio moduli tra cui nome e l'URL. In questo modo il cliente è in grado di abilitare/disabilitare i moduli senza toccare un singolo file Python. Inoltre, creo i menu in base all'elenco dei moduli. Per convenzione ogni modulo ha il proprio modulo Python in controllers/ che carica il suo model da models/. Ogni controller definisce uno Blueprint memorizzato come nome del controllore. Per esempio. per un modulo user, ho in controllers/user.py:

# Module name is 'user', thus save Blueprint as 'user' variable 
user = Blueprint('user', __name__) 

@user.route('/user/') 
def index(): 
    pass 

In questo modo, posso leggere il modules.yml a mio carico __init__.py e e registrare tutti i moduli abilitati in modo dinamico:

# Import modules 
for module in modules: 

    # Get module name from 'url' setting, exculde leading slash 
    modname = module['url'][1:] 

    try: 
     # from project.controllers.<modname> import <modname> 
     mod = __import__(
      'project.controllers.' + modname, None, None, modname 
     ) 
    except Exception as e: 
     # Log exceptions here 
     # [...] 

    mod = getattr(mod, modname) # Get blueprint from module 
    app.register_blueprint(mod, url_prefix=module['url']) 

spero, questo può essere qualche fonte d'ispirazione per te :)

+0

dove metti i tuoi file di test? – Alp

+1

La struttura sopra descritta è in realtà una sottodirectory con il nome del progetto ('nome_progetto /'). Esiste anche una cartella 'tests /' e una cartella 'scripts /' (per gli script eseguibili).Per 'test /' sarebbe intelligente usare la stessa struttura della risposta: 'test/modelli /' per i test del modello, 'test/controller /' per i test del controller, è il nome. Ciò richiederebbe un sovraccarico per il mantenimento della struttura, ma renderebbe molto semplice trovare i file necessari. – msiemens

15

Leggere attentamente Matt Wright's wonderful post sull'argomento.

Le caratteristiche pubblicare:

  1. Una descrizione di una struttura per i grandi progetti pallone

  2. An example application on Github

  3. una descrizione delle migliori pratiche di progettazione in generale quando si tratta di grandi dimensioni app Web, come il pattern MVC, le fabbricazioni di app, i servizi e la migrazione dei dati per citarne alcuni (la caratteristica più interessante IMHO).

2

Ho creato un'applicazione Flask yapper da zero e integrati con fiato sia per frontend e backend di sviluppo. È un semplice motore di blog, ma può essere facilmente modificato per lo sviluppo in base alle esigenze. È ben strutturato usando i Blueprints.

Checkout pagina del progetto yapper

2

ho lavorato su un social network costruito sulla cima di Flask. La particolarità del mio progetto era che il server serviva esclusivamente endpoint API e il frontend è un'app Backbone di una pagina. La struttura Flask ho preso è la seguente:

├── app │ ├── api
│ │ ├── auth.py │ │ └── ... │ ├── app.py │ ├── common │ │ ├── constants.py │ │ ├── helpers.py │ │ ├── response.py │ │ └── ... │ ├── config.py │ ├── extensions.py │ ├── frontend │ │ └── controllers.py │ ├── static │ │ └── ... │ ├── templates │ │ ├── app.html │ │ └── ... │ └── users │ ├── UserConstants.py │ ├── UserForms.py │ ├── UserHelpers.py │ ├── UserModels.py │ └── __init__.py ├── alembic | ├── version │ └── ... ├── tests │ └── ...

Potete leggere il più post di approfondimento che ho scritto sull'argomento here. Ho trovato molto più intuitivo separare diverse aree funzionali dalla propria cartella.

Ho lavorato al codice qualche tempo fa e l'ho aperto completamente! Puoi dare un'occhiata a on github.

+0

Grazie. Sembra bello. – daniels

Problemi correlati