2012-06-21 13 views
5

Ho appena iniziato con la beuta e ho raggiunto un ostacolo. Sto cercando di scrivere un piccolo blog per abituarmi al framework, quindi ho creato due pacchetti, un "auth" e "post". Ho letto la sezione Applicazioni grandi nello Flask docs.Flask: utilizzo di più pacchetti in un'app

La mia directory è simile a questa.

>/root 
>>run.py 

>>/posts 

>>>____init____.py 
>>>views.py 
>>>/templates 
>>>/static 

>>/auth 
>>>____init____.py 
>>>views.py 
>>>/templates 
>>>/static 

il run.py assomiglia a questo:

from flask import Flask 
from auth import auth_app 
from posts import posts_app 

auth_app.run() 
posts_app.run() 

/posts/__init__.py e /auth/__init__.py simile a questa:

from flask import Flask 

auth_app = Flask(__name__) 

import auth.views 

e views.py simile a questa:

from auth import auth_app 

@auth_app.route('/auth/') 
def index(): 
    return "hello auth!" 

Ma ogni volta che eseguo il server, solo il localhost/auth/è disponibile, e tutto il resto dà un 404, som presumo che l'app per i messaggi non sia in esecuzione.

Qualcuno può aiutare?

risposta

5

Il metodo auth_app.run() impedisce al programma di continuare a essere eseguito. Questo è il motivo per cui l'app posts_apps non viene eseguita. L'intero processo di pubblicazione delle pagine avviene nel metodo run() di Flask. Pertanto, è possibile concludere che non è possibile eseguire due app Flask nello stesso processo.

Se si desidera dividere l'applicazione in due come questa, il modo consigliato è utilizzare blueprints. Piuttosto che creare due app (auth e post), crei due blueprint. È quindi creare un'applicazione in questo modo ...

from flask import Flask 
from auth import auth_blueprint 
from posts import post_blueprint 

app = Flask(__name__) 
app.register_blueprint(auth_blueprint) 
app.register_blueprint(post_blueprint) 
app.run() 
+0

I progetti sono una buona idea! –

+0

Cosa succede se i blueprint 'auth' e' post' dovevano usare un modulo 'models.py' definito a livello root, insieme a' run.py'?Allora avrebbe senso dichiararli come progetti, anche se non erano "completamente indipendenti" dall'applicazione principale e quindi non riutilizzabili in altre applicazioni che non hanno lo stesso 'models.py'? Grazie! – aralar

+1

@ miguel5 Ciò che definite come "indipendente" dipende da voi. I blueprints di Flask aiutano a separare le cose su cui si occupa di Flask: la posizione dei file statici e di modello, gli URL e il loro modo di mappare le visualizzazioni, ecc. Se si desidera utilizzare questo solo per mantenere queste directory diverse , ma si basano ancora su un singolo 'model.py', quindi va bene. Se desideri anche separare i tuoi modelli nelle varie strutture dati, puoi farlo anche tu. Flask stesso non si preoccupa di come archivi il tuo file 'models.py'. –

4

Anche se sembra come se l'approccio di Mark utilizzando i modelli si adatta al vostro progetto di bene, se si desidera utilizzare applicazioni separate per ogni pacchetto si dovrebbe guardare in werkzeug.wsgi.DispatcherMiddleware.

Un singolo processo non può eseguire una seconda app dopo aver eseguito il primo (come nella domanda), ma questo non è un problema con DispatcherMiddleware. Puoi usarlo per definire un'applicazione principale e altre basate su prefissi URL.

L'esempio sui documenti distingue tra due applicazioni: frontend e backend, che vengono eseguite in base all'URL richiesto dall'utente.

Se vuoi saperne di più, leggi Matt Wright's "How I Structure My Flask Applications" e guarda Overholt, il suo progetto di esempio. Decide di utilizzare due app: una per il sito Web principale (il frontend) e un'altra per l'API e crea la distinzione tra i due in base al prefisso URL. Dal suo codice *:

 from werkzeug.serving import run_simple 
    from werkzeug.wsgi import DispatcherMiddleware 
    from overholt import api, frontend 


    application = DispatcherMiddleware(frontend.create_app(), { 
     '/api': api.create_app() 
    }) 


    if __name__ == "__main__": 
     run_simple('0.0.0.0', 5000, application, use_reloader=True, use_debugger=True) 

In questo modo, si crea due applicazioni in cui ciascuno ha relativo insieme definito di vista, configurazioni, ecc ed è in grado di eseguirli dallo stesso processo interprete Python.

* Si noti che run_simple() è destinato esclusivamente allo sviluppo - non alla produzione.