我正在尝试为新的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可以是绝对的。为什么后面的设置无法加载静态媒体?
答案 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_URL
和runserver's
本地域中的域不匹配时,Django仅提供来自STATIC_ROOT的内容,并且不会尝试从app文件夹中检索媒体。不知道为什么,但就是这样。
如果我运行manage.py collectstatic
,它会通过将所有应用程序文件夹媒体复制到我的STATIC_ROOT中来有效地修复404错误。或者,我可以在我的STATIC_URL
中使用相同的域,Django会自动在应用文件夹中找到任何未收集的媒体。