2012-06-27 11 views
9

Tengo una pregunta general sobre el nuevo marco de archivos estáticos Django 1.3.django staticfiles en la raíz de la url

Me gusta mucho la nueva funcionalidad Django staticfile presentada en Django 1.3. Normalmente, configuro STATIC_URL = "/ static /" e ingreso la {{STATIC_URL}} etiqueta de plantilla en mis plantillas. Es genial cómo el servidor de desarrollo sirve automáticamente los archivos estáticos y todo mi contenido se sirve como se esperaba.

The {{ STATIC_URL }} would be substituted in the template and might serve up files like this... 
example.com/static/css/master.css 
example.com/static/images/logo.png 
example.com/static/js/site.js 

Sin embargo, estoy trabajando con un sitio heredado donde el medio estático está montado en la raíz de la URL. Por ejemplo, la ruta de acceso a las direcciones URL estáticas podría ser algo como esto:

example.com/css/master.css 
example.com/images/logo.png 
example.com/js/site.js 

No utiliza el espacio de nombres URL "estática".

Me preguntaba si hay una manera de obtener la nueva funcionalidad de archivo estático para no usar el espacio de nombres estático y servir las direcciones anteriores, pero aún conservar los beneficios de la nueva estructura estática (recopilatorios, archivos estáticos servidos por el servidor de desarrollo, etc.) Intenté configurar STATIC_URL = "" y STATIC_URL = "/", pero ninguno parecía tener el efecto deseado.

¿Hay alguna manera de configurar los archivos estáticos para servir archivos estáticos sin un espacio de nombres? Gracias por tu consideración.

Respuesta

4

Puede añadir manualmente ubicaciones adicionales que no existen dentro de los static directorios dentro de su proyecto:

urls.py

from django.conf import settings 
from django.conf.urls.static import static 

urlpatterns = patterns('', 
    # ... the rest of your URLconf goes here ... 
) 

if settings.DEBUG: 
    urlpatterns += static('/css/', document_root='app_root/path/to/css/') 
    urlpatterns += static('/images/', document_root='app_root/path/to/images/') 
    urlpatterns += static('/js/', document_root='app_root/path/to/js/') 

Esto mapear los medios de comunicación para el servidor de depuración prog. Y cuando está ejecutando su servidor de modo de producción, obviamente estará manejando estas ubicaciones estáticas desde el servidor web en lugar de enviar la solicitud a django.

+0

Gracias jdi. En las plantillas, ¿seguiría {{STATIC_ROOT}} o simplemente lo dejaría como/css /,/images /,/js/....? –

+0

Ya no formaría parte de la aplicación estática, ya que no se puede recopilar a través de 'python manage.py collectstatic'. Simplemente usaría URL simples como esa: '/ css/foo.css'. Estos se están sirviendo explícitamente desde ubicaciones individuales. Incluso pueden existir fuera del espacio del proyecto django. – jdi

+0

document_root no debe comenzar con '/', debe especificar el directorio raíz de su proyecto django, por ejemplo: 'urlpatterns + = static ('/ css /', document_root = 'raíz_app/ruta/a/css /') ' –

2

por qué no mantener la funcionalidad staticfiles y simplemente usar reescrituras en el nivel del servidor web para mostrar el contenido.

por ejemplo:

rewrite /css /static permanent; (for nginx) 

Esto mantendría el directorio del proyecto mucho más limpio y también hacen que sea más fácil de mover los directorios estáticos alrededor en el futuro, por ejemplo, para mover a su STATIC_URL a un CDN.

1

Esta es la forma de configurar la urls.py para servir tanto a sus otros archivos estáticos en/index.html en Django 1.10 y (al mismo tiempo ser capaz de servir a otros puntos de vista de Django):

from django.contrib.staticfiles.views import serve 
from django.views.generic import RedirectView 

urlpatterns = [ 

    #/routes to index.html 
    url(r'^$', serve, 
     kwargs={'path': 'index.html'}), 

    # static files (*.css, *.js, *.jpg etc.) served on/
    url(r'^(?!/static/.*)(?P<path>.*\..*)$', 
     RedirectView.as_view(url='/static/%(path)s')), 
] 

Consulte this answer donde escribí una explicación más completa de dicha configuración, especialmente si desea usarla para producción.

Cuestiones relacionadas