2012-07-13 8 views
21

Intento crear una aplicación simple pero no trivial con Flask y sigo encontrándome con una situación que no se explica bien en los documentos.Estructura de las aplicaciones del matraz

Me gustaría que mi aplicación para ser dividido entre los diferentes módulos, pero parece que es difícil acceder al app objeto principal (o db de flask-sqlalchemy) desde cualquier otro lugar que el módulo principal. Parece que realmente tiene que escribir su propia forma de tratarlo como un mundo al que todo tiene acceso, lo que requiere un código cuestionable y un poco de tiempo.

Ambos app y db se crean en el nivel donde se crea una instancia de la aplicación principal y cada ejemplo supone que están disponibles en el nivel superior. Pero si divido diferentes manejadores de url en diferentes módulos, pierdo la capacidad de usar el decorador @app.route. Puedo solucionarlo con app.add_url_rule('/...', some.module...), pero de nuevo, la aplicación no se pasa a esa función.

Lo mismo ocurre con el db - No sé si debería pegarlo en g, o hacerlo accesible a través de app de alguna manera. Sin embargo, hacer eso no me ayuda a mover los modelos a un módulo aparte: ¿cómo se supone que debo acceder al db cuando los importo? Todos los ejemplos asumen de nuevo que solo está disponible como una variable local.

¿Me falta algo obvio, o estoy tratando de usar el matraz para la tarea incorrecta aquí?

+0

Los decoradores son solo envoltorios de funciones. Puede hacer una clase que encapsule toda la lógica del servidor y almacene todas las variables 'db' y' app' dentro de la clase. – Blender

+0

@Blender Claro, hay muchas maneras de resolver esto a mano. Lo que realmente quiero averiguar es si hay alguna forma estándar de manejarlo y si parece que falta por completo en los documentos, ¿hay más sorpresas en el camino? Esperaba una solución más obvia del matraz presentado en alguna parte. – viraptor

+0

Puede utilizar Blueprint – user956424

Respuesta

19

La respuesta a su pregunta es planos. De hecho, si nos fijamos en la documentación, se menciona que los planos están ahí para permitir la división de la aplicación en los módulos.

Código de ejemplo:

from flask import Blueprint 

    mod = Blueprint(blueprint_name, __name__, template_folder="folder_name" 
        static_folder="folder_name") 

    @mod.route('/mymodule') 
    def view(): 
     # your code 

En app.py

from yourmodule import mod 

    app.register_blueprint(mod) 

Ésta es la manera correcta de dividir en módulos de aplicación. Consulte los documentos de blueprint para obtener más detalles.

Además, si necesita acceder a la aplicación en cualquier otro módulo, debe utilizar el proxy current_app de la aplicación.

from flask import current_app 

Control hacia fuera este document que guía la forma de dividir aplicación frasco en módulos para grandes proyectos por parte del creador del frasco.

+0

Muy buen enlace a la documentación! ;) –

+1

@IgnasB. ¡Gracias!Echa un vistazo a este repositorio en github con la estructura básica de la aplicación de matraz grande https://github.com/codecool/flask-app-structure – codecool

+0

¡Echaré un vistazo! ;) –

2

¿Ha visto el nuevo blueprintsfeature (no he usado todavía, pero suena como esto puede ser útiles en su caso).

Cuestiones relacionadas