2012-07-21 12 views
14

Necesito servir varios archivos estáticos de raíz en Heroku (p. Ej., domain.com/favicon.ico). Aquí está la lista de los archivos en su estado actual:Sirviendo archivos estáticos de raíz en Heroku con Django?

favicon.ico 
crossdomain.xml 
sitemap.xml 
robots.txt 
humans.txt 
apple-touch-icon-57x57-precomposed.png 
apple-touch-icon-57x57.png 
apple-touch-icon-72x72-precomposed.png 
apple-touch-icon-72x72.png 
apple-touch-icon-114x114-precomposed.png 
apple-touch-icon-114x114.png 
apple-touch-icon-precomposed.png 
apple-touch-icon.png 

He buscado alta y baja y no puedo encontrar una manera estándar para servir a un gran conjunto de archivos estáticos. Dondequiera que los aloje (en Heroku con collectstatic o Amazon S3), la definición explícita y la redirección de 14 archivos en mi urls.py parece incorrecta.

+0

¿Cuál es su principal problema: no puede cargar archivos a heroku/S3 o establecer la URL correcta a estos recursos? – nk9

+0

@ b1-Configurar la URL correcta. – knite

+0

prueba este manual [blog1] (http://matthewphiong.com/managing-django-static-files-on-heroku) [blog2] (http://www.iknuth.com/2011/10/deploying-a- django-app-to-heroku-with-easy-static-files-on-s3 /). Sé ware, creo que es para django 1.3. Si no ayuda a publicar 'settings.py'. – nk9

Respuesta

1

No encontré ningún archivo de configuración de url, así que creo que heroku no proporciona este servicio.

Y de acuerdo con official docs necesita guardar los datos en los servicios externos

EDIT:

Así que de acuerdo a documentos heroku solamente 301 vuelve a dirigir a S3 puede ayudar. O incluso mejor para todos los archivos de medios (ico, favicons, png y otras imágenes) en plantillas, establezca la ruta absoluta a los servicios S3 y para robots y crossdomain.xml en urls.py establezca 301 redireccionamientos a S3. Para el mejor uso de sitemap.xml native solutions

No está mal usar códigos de redirecciones correctas en desarrollo.

+0

Mi pregunta indica que estoy usando un servicio externo (Amazon S3). Estoy preguntando sobre la mejor manera de servir los archivos (por ejemplo, urls.py). – knite

+0

Acabo de editar mi respuesta. ¿También necesitas código o solución abstracta? ;) – nk9

4

Esta es mi solución actual. Comentarios apreciados.

from django.contrib.staticfiles.urls import staticfiles_urlpatterns 
from settings import STATIC_URL, ASSETS, DEBUG, AWS_STORAGE 

#ASSETS is a tuple: ('favicon.ico, 'robots.txt', ...)  
urls = [('^%s$' % f, 'redirect_to', {'url': STATIC_URL + f}) for f in ASSETS] 
urlpatterns += patterns('django.views.generic.simple', *urls) 

#Serve static files from runserver if in dev mode with S3 off. 
if DEBUG and not AWS_STORAGE: 
    urlpatterns += staticfiles_urlpatterns() 
+0

Dado que probablemente no tenga muchos recursos raíz, creo que esta solución es lo suficientemente fina. –

1

A pesar de que esta es una vieja pregunta, todavía tengo el problema. Me gusta la forma en que se generan las URL a partir de una lista en la solución actual, pero no estaba convencido de que fuera la mejor.

Después de un poco de investigación, sin embargo, me pareció realfavicongenerator.net siendo un recurso muy útil que genera todos los archivos favicons necesarios para usted y me enviaron this post por un colega que parece apoyar la solución propuesta, con una versión más reciente de Django .

Sobre la base de todo el, mi solución anterior es el uso de marco mapa natal, django-robots de robots.txt y un diccionario ROOT_ASSETS, con archivos de prefijo como la clave, y los valores como una lista de archivos, por ejemplo:

ROOT_ASSETS = { 
    "images/favicons/": [ 
     "apple-touch-icon-114x114.png", 
     "apple-touch-icon-120x120.png", 
     "apple-touch-icon-144x144.png", 
     "apple-touch-icon-152x152.png", 
     "apple-touch-icon-180x180.png", 
     "apple-touch-icon-57x57.png", 
     "apple-touch-icon-60x60.png", 
     "apple-touch-icon-72x72.png", 
     "apple-touch-icon-76x76.png", 
     "apple-touch-icon-precomposed.png", 
     "favicon.ico", 
    ] 
} 

Entonces me generan mis URL con:

from django.conf.urls import patterns, url, include 
from django.contrib.staticfiles.storage import staticfiles_storage 

root_assets_urls = [] 
for prefix, files in ROOT_ASSETS.iteritems(): 
    for f in files: 
     asset_url = staticfiles_storage.url("{prefix}{file}".format(prefix=prefix, file=f)) 
     root_assets_urls.append(
      url(r'^{0}$'.format(f), RedirectView.as_view(url=asset_url)) 
     ) 
root_assets = patterns('', *root_assets_urls) 

urlpatterns = patterns(
    '', 
    url(r'^', include(root_assets)), 
    [...] 
) 

también estoy incluyendo el código HTML generado por realfavicongenerator.net en la cabeza de mi plantilla maestra.

Cuestiones relacionadas