在Django中使用STATIC_URL的相对vs绝对URL

时间:2013-05-15 19:22:02

标签: python django

我正在尝试为新的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

但是,如果我使用像STATIC_URL = 'http://localhost:8000/static/'这样的绝对网址,就好像我使用的是CDN,那么http://localhost:8000/static/css/custom.css会返回404错误。

这些设置不应该有效相同吗? docs状态STATIC_URL可以是绝对的。为什么后面的设置无法加载静态媒体?

3 个答案:

答案 0 :(得分: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/'

答案 1 :(得分:2)

我假设您使用static中的django.conf.urls.static函数在开发环境中提供静态文件(即DEBUG=True)。现在你可以在文档中看到这个函数不能使用启用了DEBUG的绝对URL。

所以来自文档:

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

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

答案 2 :(得分:0)

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

我这样做是为了简化我在用于测试各种版本IE的外部开发Windows机器中的媒体托管的一部分。

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

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