Обслуживать статические файлы на уровне корня на Heroku с помощью Django?

Мне нужно обслуживать несколько статических файлов на корневом уровне на Heroku (например, domain.com/favicon.ico). Вот список файлов, которые он сейчас стоит:

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

Я искал высокий и низкий и не могу найти стандартный способ обслуживания большого набора статических файлов. Где бы я ни размещал их (на Heroku с collectstatic или Amazon S3), явное определение и перенаправление 14 файлов в моем urls.py кажется неправильным.

Ответы

Ответ 1

Это мое текущее решение. Обратная связь оценена.

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()

Ответ 2

Я не нашел никаких конфигурационных файлов url, поэтому считаю, что heroku не предоставляет эту услугу.

В соответствии с официальными документами вам нужно сохранить свои данные на внешних сервисах

EDIT:

Таким образом, согласно документам heroku, вам может помочь только 301 переадресация на S3. Или даже лучше для всех медиафайлов (ico, favicons, png и других изображений) файлы в шаблонах устанавливают абсолютный путь к службам S3, а для роботов и crossdomain.xml в urls.py задают 301 переадресацию на S3. Для sitemap.xml лучше использовать родные решения

Неправильно использовать правильные коды переадресаций в разработке.

Ответ 3

Несмотря на то, что это старый вопрос, у меня все еще есть проблема. Мне нравится, как URL-адреса генерируются из списка в текущем решении, но я не был уверен, что это было лучше всего.

После небольшого исследования я обнаружил, что realfavicongenerator.net является очень полезным ресурсом, который генерирует все необходимые файлы favicons для вас и для меня был отправлен этот пост от коллеги, который, кажется, поддерживает предлагаемое решение, с более новой версией Django.

Исходя из всего вышеизложенного, мое решение использует встроенную инфраструктуру sitemap, django-robots для robots.txt и словарь ROOT_ASSETS с файлами префикс в качестве ключа и значения в виде списка файлов, например:

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

Затем я создаю свои URL-адреса с помощью:

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

Я также включаю HTML, созданный realfavicongenerator.net в моей главной головке шаблона.