为什么 collectstatic 会将我删除的文件添加回 Wagtail 项目?

问题描述

因此,我将 Wagtail 项目部署到 DigitalOcean 上的一个 Droplet 中,但由于后处理失败,collectstatic 步骤一直失败。我不需要失败的目录,所以我从我的项目中删除了它。但不知何故,每次我尝试运行 collectstatic 时,旧目录都会返回,并且后处理在一个不再存在但似乎以某种方式困扰着我的服务器的文件上不断失败。

以下是我尝试过的方法

  1. 完全删除静态目录
  2. 从我的存储库中删除有问题的目录 (peakjob) 并运行 git clean 从我的服务器中删除所有未跟踪的文件
  3. 删除我的整个项目目录,创建一个新的 virtualenv 并克隆我的项目的新副本并删除有问题的目录
  4. 注销我的服务器并重新登录
  5. 运行 collectstatic --clear(当我运行它时似乎没有删除任何东西)
  6. 退出终端并重新启动它,然后重新登录我的服务器
  7. 销毁我的整个 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 在您的本地计算机上,它也失败了吗?
  • ...

调试愉快。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...