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?
risposta
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!
stamattina impressionante, buon lavoro! –
Davvero così. Grazie! – jdsantiagojr
Prima di eseguire 'fab d' come descritto nel README, è necessario attivare l'ambiente virtuale con 'source env/bin/activate' – JRG
Flask 0.7 attrezzi Blueprints. Sono ottimi per l'utilizzo del decoratore route
senza importare l'oggetto dell'applicazione principale.
In che modo un progetto è diverso da un modulo? – dcolish
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'. –
Ho integrato i progetti nel progetto del mio fiasco, vedi la mia risposta. – imwilsonxu
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 :)
dove metti i tuoi file di test? – Alp
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
Leggere attentamente Matt Wright's wonderful post sull'argomento.
Le caratteristiche pubblicare:
Una descrizione di una struttura per i grandi progetti pallone
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).
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
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.
Grazie. Sembra bello. – daniels
- 1. Il processo avviato si blocca quando l'output reindirizzato è relativamente grande
- 2. È un mutex condiviso più efficiente di un atomico di una struttura relativamente grande?
- 3. Come organizzare i controller/presentatori in una grande applicazione JavaFx 2.0?
- 4. Come organizzare un progetto C++
- 5. Come organizzare grandi app lucide?
- 6. Come organizzare un progetto Python?
- 7. Come organizzare la registrazione centralizzata?
- 8. Come organizzare le interfacce TypeScript
- 9. Come copiare file con ansible relativamente al ruolo?
- 10. Come utilizzare app.config.from_envvar? (Flask)
- 11. Flask-Admin + (Flask-Login e/o Flask-Principal)
- 12. Token CSRF Flask-Security
- 13. Come organizzare la cartella app_code di ASP.NET?
- 14. Come organizzare il codice GUI (per PyQt)?
- 15. Come organizzare "progetti" e "soluzioni" in Eclipse?
- 16. Come dovrei organizzare la mia GUI Java?
- 17. Come organizzare i miei file spec?
- 18. Come organizzare callback complessi in Rails?
- 19. Come organizzare il mio codice c
- 20. Come dovrei organizzare molti moduli Perl?
- 21. Come organizzare file di grandi dimensioni?
- 22. Rails: come formattare e organizzare i percorsi
- 23. Come organizzare i miei file usando CMake?
- 24. Come organizzare i file nei programmi Haskell?
- 25. Implementazione campo Select2 in flask/flask-admin
- 26. Manipolazione con più domini a Flask
- 27. Categorizzare, etichettare o organizzare richieste pull GitHub?
- 28. Come organizzare le funzioni JS in più file
- 29. Come organizzare progetti Java più grandi - Projects vs. Namespacing?
- 30. Come memorizzare una grande immagine in CloudKit?
Mi piace molto il layout spiegato qui: http://flask.pocoo.org/docs/patterns/packages/ – obmarg
Qui stanno utilizzando le importazioni circolari che vorrei evitare. – daniels
Vero, ma non penso che sia evitabile se si desidera utilizzare l'app.route decorator. – obmarg