为什么 collectstatic 复制到错误的目录?
Why does collectstatic copy to wrong directory?
我以为我了解静态文件、collectstatic 等。但这让我头晕目眩:
在settings.py
中:
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
那我运行
python manage.py collectstatic
那我明白了
You have requested to collect static files at the destination
location as specified in your settings:
D:\Code\Project\staticfiles
我很确定在某一时刻我确实使用了 'staticfiles'。但是现在我已经将它更改为 'static' 并且它仍然认为目的地应该是静态文件。我已经删除了 __pycache__
文件夹,但它仍然不起作用。
[更新]
我有一个自定义设置文件。我将其基于 Two Scoops,其中有一个设置文件夹,其中包含 base.py 设置以及 local.py 和 production.py。我是 运行ning 本地人,local.py 只有 db creds 和 DEBUG = True。
我没有 STATICFILES_STORAGE 的任何价值。
如果我print
STATIC_ROOT我看到:
D:\Code\Project\static
[更新]
我现在正在查看 source code。第 161 行的 self.storage.location 是从 django.contrib.staticfiles.storage 的第 5 行导入的。在 storage.py 中,它被设置为等于第 442 行的 ConfiguredStorage()。ConfiguredStorage() 继承了一个名为 LazyObject 的 class 并具有一个名为 _setup 的函数。这就是这条路对我来说变冷的地方。我试图找出 self.storage.location 是如何定义的。但我不知道现在该走哪条路 - 我如何按照面包屑导航回到如何 STATIC_ROOT?
由于您有两个设置,一个用于生产,一个用于开发,您可能需要在 运行 collectstatic
命令时指定设置模块通过使用 --settings
标志。
所以,试试这个
python manage.py collectstatic <b>--settings=path.to.settings.module</b>
更新-1
问题
问题出在这个声明中,
django_heroku.settings(locals())
该特定语句采用所有局部变量(即 local()
)和 为您的项目创建必要的设置 .
In that module, we can see these statements,
if staticfiles:
logger.info('Applying Heroku Staticfiles configuration to Django settings.')
config['STATIC_ROOT'] = os.path.join(config['BASE_DIR'], 'staticfiles')
config['STATIC_URL'] = '/static/'
这意味着,如果您不这样做,django_heroku
软件包将为您设置一个 STATIC_ROOT
值有一个。 (是的,你的 base.py
中没有 STATIC_ROOT
)
解决方案
案例 1:将本地设置和生产设置分开 STATIC_ROOT
只需在相应的设置模块中覆盖STATIC_ROOT
的值即可,
#settings/local.py
STATIC_ROOT = 'static_root_for_local/'
#settings/production.py
STATIC_ROOT = 'static_root_for_production/'
情况 2:所有设置相同 STATIC_ROOT
# settings/base.py
# other settings variable
django_heroku.settings(locals())
STATIC_ROOT = 'common_static_root/' # this statement should be after the "django_heroku.settings(locals())"
我以为我了解静态文件、collectstatic 等。但这让我头晕目眩:
在settings.py
中:
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
那我运行
python manage.py collectstatic
那我明白了
You have requested to collect static files at the destination
location as specified in your settings:
D:\Code\Project\staticfiles
我很确定在某一时刻我确实使用了 'staticfiles'。但是现在我已经将它更改为 'static' 并且它仍然认为目的地应该是静态文件。我已经删除了 __pycache__
文件夹,但它仍然不起作用。
[更新] 我有一个自定义设置文件。我将其基于 Two Scoops,其中有一个设置文件夹,其中包含 base.py 设置以及 local.py 和 production.py。我是 运行ning 本地人,local.py 只有 db creds 和 DEBUG = True。
我没有 STATICFILES_STORAGE 的任何价值。
如果我print
STATIC_ROOT我看到:
D:\Code\Project\static
[更新] 我现在正在查看 source code。第 161 行的 self.storage.location 是从 django.contrib.staticfiles.storage 的第 5 行导入的。在 storage.py 中,它被设置为等于第 442 行的 ConfiguredStorage()。ConfiguredStorage() 继承了一个名为 LazyObject 的 class 并具有一个名为 _setup 的函数。这就是这条路对我来说变冷的地方。我试图找出 self.storage.location 是如何定义的。但我不知道现在该走哪条路 - 我如何按照面包屑导航回到如何 STATIC_ROOT?
由于您有两个设置,一个用于生产,一个用于开发,您可能需要在 运行 collectstatic
命令时指定设置模块通过使用 --settings
标志。
所以,试试这个
python manage.py collectstatic <b>--settings=path.to.settings.module</b>
更新-1
问题
问题出在这个声明中,
django_heroku.settings(locals())
该特定语句采用所有局部变量(即 local()
)和 为您的项目创建必要的设置 .
In that module, we can see these statements,
if staticfiles: logger.info('Applying Heroku Staticfiles configuration to Django settings.') config['STATIC_ROOT'] = os.path.join(config['BASE_DIR'], 'staticfiles') config['STATIC_URL'] = '/static/'
这意味着,如果您不这样做,django_heroku
软件包将为您设置一个 STATIC_ROOT
值有一个。 (是的,你的 base.py
中没有 STATIC_ROOT
)
解决方案
案例 1:将本地设置和生产设置分开 STATIC_ROOT
只需在相应的设置模块中覆盖STATIC_ROOT
的值即可,
#settings/local.py
STATIC_ROOT = 'static_root_for_local/'
#settings/production.py
STATIC_ROOT = 'static_root_for_production/'
情况 2:所有设置相同 STATIC_ROOT
# settings/base.py
# other settings variable
django_heroku.settings(locals())
STATIC_ROOT = 'common_static_root/' # this statement should be after the "django_heroku.settings(locals())"