问题描述
因此,我将 Wagtail 项目部署到 DigitalOcean 上的一个 Droplet 中,但由于后处理失败,collectstatic 步骤一直失败。我不需要失败的目录,所以我从我的项目中删除了它。但不知何故,每次我尝试运行 collectstatic 时,旧目录都会返回,并且后处理在一个不再存在但似乎以某种方式困扰着我的服务器的文件上不断失败。
以下是我尝试过的方法:
- 完全删除静态目录
- 从我的存储库中删除有问题的目录 (peakjob) 并运行 git clean 从我的服务器中删除所有未跟踪的文件
- 删除我的整个项目目录,创建一个新的 virtualenv 并克隆我的项目的新副本并删除有问题的目录
- 注销我的服务器并重新登录
- 运行 collectstatic --clear(当我运行它时似乎没有删除任何东西)
- 退出终端并重新启动它,然后重新登录我的服务器
- 销毁我的整个 droplet,然后创建一个新的 droplet,创建一个新的 virtualenv 并克隆我的项目的一个新副本,其中不包含有问题的目录。
每当我运行 collectstatic 时,它仍然会以某种方式重新添加我删除的违规目录,即使在我炸毁所有内容并开始全新部署之后仍然失败。 Django 中是否有一些类似缓存的东西需要清除? Django 还能在哪里引用这个不再存在的目录?如果有人有任何想法,我会全神贯注。
Post-processing 'oldcodingprojects/peakjob/css/font-awesome.min.css' Failed!
Traceback (most recent call last):
File "manage.py",line 24,in <module>
main()
File "manage.py",line 20,in main
execute_from_command_line(sys.argv)
File "/home/mkvportfolio/mvportfolio/.venv/lib/python3.8/site-packages/django/core/management/__init__.py",line 419,in execute_from_command_line
utility.execute()
File "/home/mkvportfolio/mvportfolio/.venv/lib/python3.8/site-packages/django/core/management/__init__.py",line 413,in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/mkvportfolio/mvportfolio/.venv/lib/python3.8/site-packages/django/core/management/base.py",line 354,in run_from_argv
self.execute(*args,**cmd_options)
File "/home/mkvportfolio/mvportfolio/.venv/lib/python3.8/site-packages/django/core/management/base.py",line 398,in execute
output = self.handle(*args,**options)
File "/home/mkvportfolio/mvportfolio/.venv/lib/python3.8/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py",line 187,in handle
collected = self.collect()
File "/home/mkvportfolio/mvportfolio/.venv/lib/python3.8/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py",line 134,in collect
raise processed
File "/home/mkvportfolio/mvportfolio/.venv/lib/python3.8/site-packages/django/contrib/staticfiles/storage.py",line 288,in _post_process
content = pattern.sub(converter,content)
File "/home/mkvportfolio/mvportfolio/.venv/lib/python3.8/site-packages/django/contrib/staticfiles/storage.py",in converter
hashed_url = self._url(
File "/home/mkvportfolio/mvportfolio/.venv/lib/python3.8/site-packages/django/contrib/staticfiles/storage.py",line 126,in _url
hashed_name = hashed_name_func(*args)
File "/home/mkvportfolio/mvportfolio/.venv/lib/python3.8/site-packages/django/contrib/staticfiles/storage.py",line 338,in _stored_name
cache_name = self.clean_name(self.hashed_name(name))
File "/home/mkvportfolio/mvportfolio/.venv/lib/python3.8/site-packages/django/contrib/staticfiles/storage.py",line 88,in hashed_name
raise ValueError("The file '%s' Could not be found with %r." % (filename,self))
解决方法
很难说到底出了什么问题。
collectstatic
是一个 Django 命令。鹡鸰似乎无关。
假设您有这些设置:
STATIC_ROOT = BASE_DIR / "static"
STATIC_URL = "/static/"
您的网络服务器应配置为直接从 /static/
目录处理以 STATIC_ROOT
开头的请求。所有其他请求都应该指向 Django 应用程序。网络服务器不应提供存在于虚拟环境中的文件。
这就是 collectstatic
的用武之地。它将静态文件从虚拟环境和您的项目复制到 STATIC_ROOT
目录。将它们公开。
之后,复制一些文件存储后端可能会执行后期处理步骤。例如,创建唯一的哈希并使缓存无效。
为什么 collectstatic
会尝试对不存在的文件进行后期处理。一个被 collectstatic 自己复制到那里的文件?
- 将
print(STATIC_ROOT)
放入您的设置中,然后运行 collectstatic
。打印确切的目录。 - 检查目录,是否存在?它是否具有正确的读写权限?
- 列出目录的内容,看看是否有预期的文件可用。
- 运行
collectstatic --no-post-process
,是否只是后期处理步骤? - 在预期位置创建一个空的
font-awesome.min.css
-
collectstatic
在您的本地计算机上,它也失败了吗? - ...
调试愉快。