使用 Django 在 Heroku 上提供根级静态文件?
Posted
技术标签:
【中文标题】使用 Django 在 Heroku 上提供根级静态文件?【英文标题】:Serving root-level static files on Heroku with Django? 【发布时间】:2012-07-20 07:26:10 【问题描述】:我需要在 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),在我的 urls.py 中明确定义和重定向 14 个文件似乎都不正确。
【问题讨论】:
那么您的主要问题是:您无法将文件加载到 heroku/S3 或为此资源设置正确的 url? @b1-设置正确的 URL。 试试这个手册blog1blog2。请注意,我认为它适用于 django 1.3。如果它没有帮助你发帖settings.py
.
这些都是不错的资源,但问题是我想在根级别(domain.com/favicon.ico)提供静态文件,我不想使用 Django 的静态视图(它不打算在生产中使用)。
你好针织。在试图找出related one 时,我在这里遇到了您的绝妙问题。很抱歉,目前还没有答案。你有没有找到其他方法?
【参考方案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 的方式,但我不相信这是最好的。
不过,经过一番研究,我发现realfavicongenerator.net 是一个非常有用的资源,它可以为您生成所有必需的网站图标文件,并且我的一位同事向我发送了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("prefixfile".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 包含在我的主模板的头部。
【讨论】:
【参考方案3】:我没有找到任何 url 配置文件,所以我认为 heroku 不提供此服务。
根据official docs,您需要将数据保存在外部服务中
编辑:
因此,根据 heroku 文档,只有 301 重定向到 S3 可以帮助您。甚至更好地为模板中的所有媒体(ico、favicons、png 和其他图像)文件设置 S3 服务的绝对路径以及 urls.py
中的 robots 和 crossdomain.xml 设置 301 重定向到 S3。对于sitemap.xml,最好使用native solutions
在开发中使用正确的重定向代码并没有错。
【讨论】:
我的问题表明我正在使用外部服务 (Amazon S3)。我在询问提供文件的最佳方式(例如 urls.py)。 我只是编辑我的答案。您是否也需要代码或抽象解决方案? ;)以上是关于使用 Django 在 Heroku 上提供根级静态文件?的主要内容,如果未能解决你的问题,请参考以下文章
使用 AWS S3 for django 在 heroku 上提供静态文件?
Heroku 上带有 gunicorn 服务器的 Django 项目不提供静态文件
使用 Django 在 Heroku 上接收带有图像的特定页面的服务器错误 500(由 WhiteNoise 提供静态服务)
Heroku 上带有 Postgresql 的 Django - settings.DATABASES 配置不正确。请提供名称值