6

我正在尝试为新的 Django 项目设置适当的 STATIC_URL 和 STATIC_ROOT 值,但在为 STATIC_URL 使用绝对 URL 时遇到了问题。

我的项目结构如下:

<project root>
    static
    media
    src
        <apps>
        static
            js
            css
                custom.css
            i
        settings.py

在我的 settings.py 中,我有

STATIC_ROOT = os.path.abspath(os.path.join(os.path.dirname(os.path.realpath(__file__)), '../static/'))

如果我设置STATIC_URL = '/static/',那么我可以http://localhost:8000/static/css/custom.css完美访问。

但是,如果我使用绝对 URL STATIC_URL = 'http://localhost:8000/static/',就像我使用的是 CDN 一样,则会http://localhost:8000/static/css/custom.css返回 404 错误。

这些设置不应该实际上是相同的吗?文档状态 STATIC_URL 可以是绝对的。为什么后期设置加载静态媒体失败?

4

3 回答 3

6

我只是测试了同样的东西,使用http://localhost:8000/static/对我也不起作用。

在我的设置中,我保留了一个开发变量,因此在 localhost 上,url 是'/static/',当我部署(并且我设置DEVELOPMENT = False)时,它是一个完整的 url。

if DEVELOPMENT == True:
    STATIC_URL = '/static/'
else:
    STATIC_URL = 'https://www.mywebsite.com/static/'
于 2013-05-15T19:49:37.843 回答
3

我假设您正在使用 中的static函数django.conf.urls.static在开发环境中提供静态文件(这意味着DEBUG=True)。现在,正如您在文档中看到的那样,此功能不适用于DEBUG启用的绝对网址。

所以从文档中:

https://docs.djangoproject.com/en/dev/howto/static-files/#serving-static-files-during-development

“此辅助函数仅在调试模式下有效,并且仅当给定前缀是本地的(例如 /static/)而不是 URL(例如http://static.example.com/)时才有效。”

于 2013-11-15T18:22:04.513 回答
0

原因和解决方案很简单,但是根据我描述问题的方式发现它是不直观的。我没有提到我的绝对STATIC_URL实际上有一个不同的域(http://localmedia:8000/static/不是http://localhost:8000/static/)。

我这样做是为了简化我用来测试各种版本的 IE 的几个外部开发 Windows 机器之间的媒体托管。

但是,当域中的域STATIC_URL和本地域不匹配时runserver's,Django 仅提供来自 STATIC_ROOT 的内容,并且不会尝试从应用程序文件夹中检索媒体。不知道为什么,但就是这样。

如果我运行manage.py collectstatic,它将通过将所有应用程序文件夹媒体复制到我的 STATIC_ROOT 来有效地修复 404 错误。或者,我可以在我的 . 中使用相同的域STATIC_URL,Django 会自动在应用程序文件夹中找到任何未收集的媒体。

于 2013-11-15T22:32:59.657 回答