2012-07-21 11 views
14

Potrzebuję obsłużyć kilka plików statycznych poziomu root na Heroku (np. domain.com/favicon.ico). Poniżej znajduje się lista plików w obecnym brzmieniu:Udostępnianie plików statycznych poziomu root na Heroku z 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 

Rozglądałem wysokie i niskie i nie mogą znaleźć standardowego sposobu służenia duży zestaw plików statycznych. Gdziekolwiek je hostuję (na Heroku z kolekcją lub Amazon S3), jednoznaczne zdefiniowanie i przekierowanie 14 plików w moim urls.py wydaje się niepoprawne.

+0

Więc, co jest głównym problemem: nie można załadować plików do heroku/S3 lub ustawić poprawny adres URL dla tych zasobów? – nk9

+0

@ b1 - Ustawianie poprawnego adresu URL. – knite

+0

wypróbuj te instrukcje [blog1] (http://matthewphiong.com/managing-django-static-files-on-heroku) [blog2] (http://www.iknuth.com/2011/10/deployinga-a- django-app-to-heroku-with-easy-statical-files-on-s3 /). Być ware Myślę, że są one dla django 1.3. Jeśli nie pomoże ci opublikować 'settings.py'. – nk9

Odpowiedz

1

Nie znalazłem żadnych plików konfiguracyjnych adresów URL, więc myślę, że heroku nie zapewnia tej usługi.

A według official docs trzeba zapisać dane na temat usług zewnętrznych

EDIT:

Więc według docs Heroku tylko 301 przekierowuje do S3 może pomóc. Lub jeszcze lepiej dla wszystkich plików multimedialnych (ico, favicons, png i inne obrazy) w szablonach ustaw pełną ścieżkę do usług S3, a dla robotów i crossdomain.xml w urls.py ustaw 301 przekierowania do S3. Dla sitemap.xml lepiej użyć native solutions

Nie jest źle używać właściwych kodów przekierowania w programowaniu.

+0

Moje pytanie stwierdza, że ​​korzystam z usługi zewnętrznej (Amazon S3). Pytam o najlepszy sposób udostępniania plików (np. Urls.py). – knite

+0

Po prostu edytuję swoją odpowiedź. Czy potrzebujesz również rozwiązania kodu lub abstrakcji? ;) – nk9

4

To jest moje obecne rozwiązanie. Opinie są mile widziane.

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

Biorąc pod uwagę, że prawdopodobnie nie będę miał wielu zasobów root, myślę, że to rozwiązanie jest wystarczająco dobre. –

1

Mimo że jest to stare pytanie, nadal mam problem. Podoba mi się sposób, w jaki adresy URL są generowane z listy w bieżącym rozwiązaniu, ale nie byłem przekonany, że jest najlepszy.

Po trochę badań chociaż znalazłem realfavicongenerator.net będąc bardzo przydatnych zasobów, które generuje wszystkie pliki wymagane favicons dla Ciebie i został wysłany this post przez kolegę, który wydaje się wspierać proponowane rozwiązanie, z nowszej wersji Django .

Na podstawie wszystkich powyżej, moim roztworu za pomocą natywnego sitemap ramy, django-robots do pliku robots.txt i słownika ROOT_ASSETS, plików z prefiksem jako klucz, a wartości jako lista plików, na przykład:

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", 
    ] 
} 

Potem generowania moje adresy URL z:

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)), 
    [...] 
) 

jestem w tym także HTML generowanego przez realfavicongenerator.net w głowie mojego mistrza szablonu.

Powiązane problemy