2011-08-25 16 views
34

Estoy desarrollando un proyecto Django (1.3) compuesto por muchas aplicaciones. Cada aplicación tiene sus propios archivos estáticos en su propio directorio static. Además, he agregado un directorio llamado project_static que debe contener archivos estáticos que son comunes en las distintas aplicaciones, como jQuery.Administración de archivos estáticos para múltiples aplicaciones en Django

El problema que me encuentro de inmediato es el de nombrar las colisiones. De forma predeterminada, collectstatic simplemente colocará todo bajo un directorio global static, sin clasificarlos por aplicación. Esto no funciona para mí, ya que cada aplicación tiene, por ejemplo, un archivo llamado css/screen.css.

La forma en que lo resolvió es mediante la eliminación de django.contrib.staticfiles.finders.AppDirectoriesFinder de STATICFILES_FINDERS y el uso de namespaced static files dirs, por lo que la configuración de mi ahora parezca

STATICFILES_DIRS = (
    os.path.join(PROJECT_PATH, 'project_static'), 
    ('my_app', os.path.join(PROJECT_PATH, 'my_app', 'static')), 
    ('another_app', os.path.join(PROJECT_PATH, 'another_app', 'static')), 
    ... 
) 

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder', 
) 

El problema es que de esta manera pierdo los archivos estáticos para todas las demás aplicaciones, por instancia django.contrib.admin. Por supuesto, podría agregar manualmente el administrador, pero no estoy seguro de cómo hacerlo sin romper el administrador, que tiene una estructura de directorios diferente.

¿Existe una forma mejor de administrar los archivos estáticos con más de una aplicación?

Respuesta

39

Este es el mismo problema que ocurre con el uso de directorios específicos de la aplicación templates. Si solo arroja los archivos directamente bajo templates en la aplicación, terminará colisionando el nombre si dos aplicaciones o incluso el directorio de nivel de proyecto templates utilizan plantillas del mismo nombre. La corrección para que se va a poner realmente las plantillas en un directorio del nombre de la aplicación en el directorio templates como:

- some_app 
    - templates 
     - some_app 
      - index.html 

Así, aplico la misma idea estática:

- some_app 
    - static 
     - some_app 
      - css 
      - img 
      - js 

De esa manera Cuando ejecuta colectastaticas, los archivos estáticos de cada aplicación individual se colocan dentro de un directorio de espacio de nombres. El único cambio que necesita hacer es colocar un prefijo a cada uno de los archivos con el directorio de nombre de la aplicación en sus plantillas. Entonces en vez de {{ STATIC_URL }}css/style.css tiene {{ STATIC_URL }}my_app/css/style.css.

+0

si servimos los archivos estáticos usando nginx ¿esta sigue siendo la forma preferida? (manteniendo los archivos estáticos, las plantillas en la aplicación en sí) – Dineshkumar

+0

Sí. Desea que todos sus activos se administren con su proyecto. –

Cuestiones relacionadas