如何在 Django settings.py 中为 CDN 设置 STATIC_URL
Posted
技术标签:
【中文标题】如何在 Django settings.py 中为 CDN 设置 STATIC_URL【英文标题】:How to set STATIC_URL in Django settings.py for CDN 【发布时间】:2018-10-26 21:17:08 【问题描述】:我想在我的 django 2.0.5 模板中使用静态文件,该模板位于:
https://my_cloud_front_adress.cloudfront.net/staticfiles/picture_small.jpg
在 Heroku 上我设置了变量:
STATIC_URL = https://my_cloud_front_adress.cloudfront.net/staticfiles/
templates/base.html
% load static %
# this one is NOT working #
<img src="% static 'picture_small.jpg' %" />
# this one is working #
<img src="https://my_cloud_front_adress.cloudfront.net/staticfiles/picture_small.jpg" />
我应该如何设置STATIC_URL
以使其在模板中工作:
<img src="% static 'picture_small.jpg' %" />
【问题讨论】:
使用% static ... %
时渲染的src值是多少?要检查这一点,右键单击图像 > 检查。
当我在 Heroku 上运行它时,我得到了错误 500。
你可以转DEBUG=TRUE
,这样你就可以真正看到错误了。或者,如果您为您的应用启用了错误日志记录,您可以发布错误日志吗?
Page not found (404) Request Method: GET Request URL: http://myexample.com/static/picture_small.jpg Using the URLconf defined in test7.urls, Django tried these URL patterns, in this order: admin/ The current path, static/picture_small.jpg, didn't match any of these.
这不是 500 错误。据此,STATIC_URL
的值设置为'/static/'
。在您的设置中将此值更改为您想要的值,一切都会正常工作。
【参考方案1】:
user3170828 的答案是正确的,但要添加您可以尝试使用django-storages,它将负责将静态文件同步到 S3/Cloudfront 和 URL。
【讨论】:
【参考方案2】:您提供的 STATIC_URL 值将与您的应用相关,因此在此处添加外部 url 没有意义。如果您希望文件在本地获取,您应该下载它们并将它们本地存储在您的应用程序中指定的 STATICFILES_DIRS 目录中,并按照Django docs 中的说明配置您的静态文件。
否则,您可以直接通过 url 访问文件,而无需尝试将它们视为项目中的静态文件。
【讨论】:
添加外部 URL 确实有意义。 Django 只是使用STATIC_URL
为您的文件构建完整的 URL。无论 URL 是相对的还是绝对的,它都应该可以工作。其实docs中有一个绝对URL的例子。
该示例未引用外部 URL。如果您在 STATIC_URL
中提供完整的 URL,您应该在那里提供所有静态文件。这在here 之前已经讨论过了。
"If you give a full URL in STATIC_URL you should serve all your static files there."
和您在评论中链接的帖子只是重申了我之前所说的 - 即您可以将 STATIC_URL
设置为外部网址。谢谢你同意我的看法。【参考方案3】:
根据django documentation,您需要...,
django.contrib.staticfiles
将此添加到 INSTALLED_APPS
。
将 STATIC_URL = '/static/'
添加到您的 settings.py 中(我想您忘记添加了。)
在模板顶部添加% load static %
。
然后使用<img src="% static "my_app/example.jpg" %" alt="My image"/>
另外还需要加STATICFILES_DIRS
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), )
【讨论】:
1)django.contrib.staticfiles
默认添加 2) 我想使用 'my_cloud_front_adress.cloudfront.net/staticfiles' 而不是 'www.mywebsiteadress.com/static/example.jpg' 3) '% load static % ' 一切就绪
是的,我在 Heroku 变量 STATIC_URL = https://my_cloud_front_adress.cloudfront.net/staticfiles/
987654331@ 上这样设置以上是关于如何在 Django settings.py 中为 CDN 设置 STATIC_URL的主要内容,如果未能解决你的问题,请参考以下文章
Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt)
如何在 Django Settings.py 中导入另一个 Python 3 文件?