使用Django在Heroku上提供根级静态文件?

时间:2012-07-21 03:16:37

标签: django heroku favicon

我需要在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

我搜索过高和低,无法找到一种标准方式来提供大量静态文件。无论我在哪里托管它们(在带有collectstatic或Amazon S3的Heroku上),在我的urls.py中明确定义和重定向14个文件似乎都是错误的。

3 个答案:

答案 0 :(得分:4)

这是我目前的解决方案。反馈意见。

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

答案 1 :(得分:1)

我没有找到任何url配置文件,所以我认为heroku不提供此服务。

根据official docs,您需要将数据保存在外部服务

编辑:

所以根据heroku docs,只有301重定向到S3才能帮到你。或者甚至更好地为所有媒体(ico,favicons,png和其他图像)模板中的文件设置S3服务的绝对路径以及urls.py中的机器人和crossdomain.xml设置301重定向到S3。对于sitemap.xml,最好使用native solutions

在开发中使用正确的重定向代码并没有错。

答案 2 :(得分:1)

尽管这是一个老问题,我仍然有问题。我喜欢从当前解决方案中的列表生成URL的方式,但我不相信这是最好的。

经过一些研究后,我发现realfavicongenerator.net是一个非常有用的资源,可以为您生成所有必需的favicons文件,我被一位似乎支持建议的解决方案的同事发送this post ,使用更新的Django版本。

基于以上所有,我的解决方案是使用本机站点地图框架,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",
    ]
}

然后我用:

生成我的网址
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)),
    [...]
)

我还将realfavicongenerator.net生成的HTML包含在主模板的头部。