2012-02-22 27 views
71

Estoy construyendo mi primera aplicación Flask y no puedo encontrar una manera clara y piatica de organizar mi aplicación. No quiero tener todo en un solo archivo .py como en su ejemplo. Me gustaría tener cada parte de mi aplicación en un módulo separado. ¿Cuál sería una buena manera de organizar las cosas?¿Cómo organizar una aplicación Flask relativamente grande?

+3

Me gusta bastante el diseño que se explica aquí: http://flask.pocoo.org/docs/patterns/packages/ – obmarg

+1

Allí están utilizando importaciones circulares que me gustaría evitar. – daniels

+0

Cierto, pero no creo que sea evitable si quiere usar la aplicación decorador de rutas. – obmarg

Respuesta

78

He creado un proyecto Frasco repetitivo llamado "Fbone", no dude en comprobarlo y tenedor :)

Fbone (hueso del frasco) es un (microframework Python) aplicación de plantilla/bootstrap/repetitivo frasco.

general

  • bien diseñados para la gran proyecto utilizando planos.
  • Integre con el framework de frontend más moderno: jQuery/html5boilerplate/bootstrap.
  • Respaldado por la famosa SQLalchemy.
  • Implemente el truco "recordarme" por el matraz de inicio de sesión.
  • Manejar formularios web por matraz-wtform.
  • Pruebas unitarias con matraz y nariz.
  • Implementar fácilmente a través de fabric y mod_wsgi (ejemplo incluido).
  • i18n por matraz de babel

por cierto, acabo de encontrar este wiki en la construcción de un gran proyecto con el frasco útil, pls lo comprueban!

+1

impresionante repetitivo, ¡buen trabajo! –

+0

Realmente me gusta esto. ¡Gracias! – jdsantiagojr

+0

Antes de ejecutar 'fab d' como se detalla en el archivo README, necesita activar su entorno virtual con 'source env/bin/activate' – JRG

20

Flask 0.7 implementa Blueprints. Son excelentes para usar el decorador route sin importar el objeto principal de la aplicación.

+1

¿En qué se diferencia un modelo de un módulo? – dcolish

+1

Técnicamente, un blueprint es una instancia de la clase Blueprint. Pueden abarcar uno o más módulos, o varios planos pueden coexistir en el mismo módulo. Hay algo de magia detrás de escena para descubrir el módulo o paquete de un blueprint, para encontrar sus carpetas 'templates' y' static'. –

+1

He integrado planos en mi proyecto de frasco de huesos, vea mis respuestas por favor. – imwilsonxu

12

Estoy trabajando en un gran proyecto Flask (por mis estándares) (5000 líneas de código Python y está solo a medio terminar). El cliente quiere que el proyecto sea modular, por lo que tomó esta apporach:

Mi estructura de carpetas es el siguiente:

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

En modules.yml defino mis módulos incluyendo el nombre y la dirección URL. De esta forma, el cliente puede habilitar/deshabilitar módulos sin tocar un solo archivo de Python. Además, genero los menús en base a la lista de módulos. Por convención, cada módulo tiene su propio módulo de Python en controllers/ que cargará su model desde models/. Cada controlador define un Blueprint almacenado como el nombre del controlador. P.ej. para un módulo user, tengo en controllers/user.py:

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

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

De esta manera, puedo leer el modules.yml en mi carga __init__.py y y registrar todos los módulos habilitados de forma dinámica:

# 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']) 

espero, esto puede ser algo de inspiración para ti :)

+0

¿dónde pones tus archivos de prueba? – Alp

+1

La estructura descrita anteriormente es en realidad un subdirectorio con el nombre del proyecto ('project_name /'). También hay una carpeta 'tests /' y una carpeta 'scripts /' (para scripts ejecutables).Para 'tests /' sería inteligente usar la misma estructura que en la respuesta: 'tests/models /' para pruebas de modelo, 'tests/controllers' para pruebas de controlador, lo que sea. Eso requeriría cierta sobrecarga para mantener la estructura, pero haría muy simple encontrar los archivos que necesita. – msiemens

15

Asegúrate de leer Matt Wright's wonderful post sobre el tema.

Las características post:

  1. Una descripción de una estructura para grandes proyectos matraz

  2. An example application on Github

  3. Una descripción de las mejores prácticas de diseño en general cuando se trata de grandes aplicaciones web, como el patrón MVC, fábricas de aplicaciones, servicios y migración de datos por nombrar algunas (característica más interesante en mi humilde opinión).

2

He creado una aplicación Frasco yapper desde cero e integrado con trago tanto para el desarrollo frontend y backend. Es un motor de blog simple, pero se puede modificar fácilmente para desarrollar según los requisitos. Está bien estructurado usando Blueprints.

Pedido la página del proyecto yapper

2

trabajé en una red social construida sobre el frasco. Lo especial de mi proyecto fue que el servidor solo sirve puntos finales API y el frontend es una aplicación Backbone de una página. La estructura Frasco Tomé es la siguiente:

├── 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 │ └── ...

Puede leer el mensaje más profundo que escribí sobre el tema here. Me pareció mucho más intuitivo separar distintas áreas funcionales en su propia carpeta.

¡Trabajé en el código hace un tiempo y lo abrí por completo! Puede verificarlo on github.

+0

Gracias. Se ve bien. – daniels

Cuestiones relacionadas