2012-06-21 14 views
5

Estoy empezando con el matraz y me he topado con un problema. Intento escribir un pequeño blog para acostumbrarme al framework, así que hice dos paquetes, un "auth" y "posts". Leí a través de la sección de Aplicaciones grandes en el Flask docs.Frasco: Usar varios paquetes en una aplicación

Mi directorio se ve así.

>/root 
>>run.py 

>>/posts 

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

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

la run.py se parece a esto:

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

auth_app.run() 
posts_app.run() 

/posts/__init__.py y /auth/__init__.py tener este aspecto:

from flask import Flask 

auth_app = Flask(__name__) 

import auth.views 

y la views.py tener este aspecto:

from auth import auth_app 

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

Pero cada vez que ejecuto el servidor, solo el localhost/auth/está disponible, y todo lo demás da un 404, som supongo que la aplicación de mensajes no se está ejecutando.

¿Alguien puede ayudar?

Respuesta

5

Su método auth_app.run() impide que su programa continúe ejecutándose. Esta es la razón por la cual la aplicación posts_apps no se ejecuta. Todo el proceso de publicación de páginas ocurre dentro del método run() de Flask. Por lo tanto, puede concluir que no puede ejecutar dos aplicaciones de Flask en el mismo proceso.

Si desea dividir su aplicación en dos como esta, la forma recomendada es usar blueprints. En lugar de crear dos aplicaciones (autenticación y publicaciones), crea dos planos. A continuación, crea una aplicación como tal ...

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

¡Los planos son una buena idea! –

+0

¿Qué sucede si los planos 'auth' y' post' tienen que usar un módulo 'models.py' definido en el nivel raíz, junto con' run.py'?Entonces, ¿tendría sentido declararlos como planos, incluso si no fueran "completamente independientes" de la aplicación principal y por lo tanto no reutilizables en otras aplicaciones que no tienen el mismo 'models.py'? ¡Gracias! – aralar

+1

@ miguel5 Lo que defina como "independiente" depende de usted. Los planos de Flask ayudan a proporcionar una manera de separar las cosas que le interesan a Flask: la ubicación de los archivos estáticos y de plantilla, las URL y cómo se asignan a sus vistas, etc. Si solo quiere usar esto para mantener estos directorios diferentes , pero todavía confían en un solo 'model.py', entonces eso está bien. Si también desea separar sus modelos en varias estructuras de datos, también puede hacerlo. Flask en sí no le importa cómo almacena su archivo 'models.py'. –

4

Aunque parece que el enfoque de la marca utilizando planos se adapte a su proyecto bien, si desea utilizar aplicaciones por separado para cada paquete que debe buscar en werkzeug.wsgi.DispatcherMiddleware.

Un solo proceso no puede ejecutar una segunda aplicación después de ejecutar la primera (como en su pregunta), pero eso no es un problema con DispatcherMiddleware. Puede usarlo para definir una aplicación principal y otras basadas en prefijos de URL.

El ejemplo en los documentos distingue entre dos aplicaciones, frontend y backend, que se ejecutan según la URL que el usuario solicite.

Si desea obtener más información, lea "How I Structure My Flask Applications" de Matt Wright y mire Overholt, su proyecto de ejemplo. Decide usar dos aplicaciones: una para el sitio web principal (la interfaz) y otra para la API, y él crea la distinción entre las dos basadas en el prefijo de la URL. Desde su código *:

 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) 

De esta manera, se crea dos aplicaciones en las que cada uno tiene su conjunto definido de puntos de vista, configuraciones, etc., y es capaz de ejecutar desde el mismo proceso de intérprete de Python.

* Tenga en cuenta que run_simple() solo está destinado a ser utilizado para el desarrollo, no para la producción.

Cuestiones relacionadas