如何在 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 %。 然后使用&lt;img src="% static "my_app/example.jpg" %" alt="My image"/&gt; 另外还需要加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包修改settings.py?

Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt)

如何在 Django Settings.py 中导入另一个 Python 3 文件?

在 Django 中为 GeoIP2 创建项目设置

如何使用每个 SITE_ID 的唯一 settings.py 设置 django

如何访问 django settings.py 中的模型或视图属性?