Django 2本地开发环境静态文件配置问题求助
解决Django开发环境静态文件收集与服务的冲突问题
我之前也踩过Django静态文件配置的坑,其实核心是要搞清楚STATICFILES_DIRS、STATIC_ROOT和STATIC_URL这三个配置的分工,尤其是它们在开发环境(DEBUG=True)下的不同作用:
先理清楚三个关键配置的作用
STATIC_URL:浏览器访问静态文件的URL前缀,你配置的/static/是完全没问题的。STATICFILES_DIRS:告诉Django,除了各个app自带的static目录外,还要从哪些目录读取源静态文件(比如你手动添加的全局css、js、图片等)。STATIC_ROOT:只有运行collectstatic命令时才会用到,它是一个目录路径,Django会把所有收集到的静态文件(包括app里的和STATICFILES_DIRS里的)复制到这个目录下。注意:这个目录绝对不能和STATICFILES_DIRS里的目录重复,否则会导致逻辑混乱。
你的两个问题原因分析
问题1:配置STATICFILES_DIRS但没STATIC_ROOT导致collectstatic报错
当你运行collectstatic时,Django需要明确知道把所有静态文件收集到哪个目录,所以必须指定STATIC_ROOT。但开发环境下的runserver不需要这个配置——因为它会自动从STATICFILES_DIRS和各个app的static目录里找源文件,所以能正常服务静态文件,但collectstatic会因缺少目标目录报错。
问题2:把STATIC_ROOT设成项目根的static导致404
你把STATIC_ROOT设成了项目根的static目录,但没有配置STATICFILES_DIRS。这时候:
collectstatic能正常运行,因为它有了目标目录,会把所有静态文件复制到这个static目录里;- 但开发服务器
runserver在DEBUG=True时,只会从各个app的static目录和STATICFILES_DIRS配置的目录里找源文件,不会读取STATIC_ROOT里的收集后文件——而你没配置STATICFILES_DIRS,服务器找不到你放在项目根static里的文件,所以出现404。
满足需求的正确配置方案
如果你想在开发环境下既能正常服务静态文件,又能运行collectstatic,同时保持项目结构清晰,推荐这样配置:
if ENVIRONMENT == "dev": # 用os.path.abspath避免相对路径的坑,适配不同系统 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) STATIC_URL = '/static/' # 源静态文件目录:放你自己手动添加的全局静态资源(比如bootstrap、自定义css) STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ] # 收集静态文件的目标目录:和源目录分开,避免源文件被收集文件干扰 STATIC_ROOT = os.path.join(BASE_DIR, 'static_collected')
为什么这样配置可行?
- 服务静态文件:开发服务器会自动从
STATICFILES_DIRS(项目根static)和各个app的static目录读取源文件,正常返回给浏览器。 - 运行collectstatic:命令会把所有静态文件(包括app里的和项目根
static里的)复制到static_collected目录,不会报错。
关于“单个static文件夹同时做收集和服务”的说明
其实不推荐把STATIC_ROOT和STATICFILES_DIRS设为同一个目录——因为collectstatic会把所有app的静态文件都复制到这个目录里,你的源目录会被塞满不属于它的文件,后期维护会很混乱。如果实在想这么做(不建议),可以把STATICFILES_DIRS留空,然后把所有全局静态资源放到某个app的static目录里,但这样显然不如单独的全局静态目录方便。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

