在服务器上运行 collectstatic:AttributeError:“PosixPath”对象没有属性“startswith”

Posted

技术标签:

【中文标题】在服务器上运行 collectstatic:AttributeError:“PosixPath”对象没有属性“startswith”【英文标题】:Running collectstatic on server : AttributeError: 'PosixPath' object has no attribute 'startswith' 【发布时间】:2018-06-20 02:43:36 【问题描述】:

使用 nginx、gunicorn、django 和 virtualenv 在数字海洋上的服务器上部署后,我尝试使用 collectstatic:

python manage.py collectstatic --settings=config.settings.production

如您所见,我有多个设置文件。一个基地,一个本地和一个生产设置文件。以下是错误:

    Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    execute_from_command_line(sys.argv)
  File "/home/tony/vp/vpenv/lib/python3.5/site-packages/django/core/management/__init__.py", line 363, in execute_from_command_line
    utility.execute()
  File "/home/tony/vp/vpenv/lib/python3.5/site-packages/django/core/management/__init__.py", line 355, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/tony/vp/vpenv/lib/python3.5/site-packages/django/core/management/base.py", line 283, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/tony/vp/vpenv/lib/python3.5/site-packages/django/core/management/base.py", line 330, in execute
    output = self.handle(*args, **options)
  File "/home/tony/vp/vpenv/lib/python3.5/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 173, in handle
    if self.is_local_storage() and self.storage.location:
  File "/home/tony/vp/vpenv/lib/python3.5/site-packages/django/utils/functional.py", line 239, in inner
    return func(self._wrapped, *args)
  File "/home/tony/vp/vpenv/lib/python3.5/site-packages/django/utils/functional.py", line 35, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/home/tony/vp/vpenv/lib/python3.5/site-packages/django/core/files/storage.py", line 283, in location
    return abspathu(self.base_location)
  File "/home/tony/vp/vpenv/lib/python3.5/posixpath.py", line 357, in abspath
    if not isabs(path):
  File "/home/tony/vp/vpenv/lib/python3.5/posixpath.py", line 64, in isabs
    return s.startswith(sep)
AttributeError: 'PosixPath' object has no attribute 'startswith'

我的production.py 设置文件包含以下内容:

MEDIA_ROOT = BASE_DIR / 'media'
MEDIA_URL = 'media/'
STATIC_ROOT = BASE_DIR / 'static'

我的基本目录如下(从基本设置文件导入):

BASE_DIR = Path(__file__).resolve().parent.parent.parent

可能是什么原因?

【问题讨论】:

【参考方案1】:

这是我之前的设置。我正在使用 Python 3.5。 Django 2.1。

BASE_DIR = Path(__file__).resolve().parent.parent.parent
STATIC_ROOT = BASE_DIR / 'static'

我只改变了一件事:

STATIC_ROOT = str(BASE_DIR / 'static')

效果很好。

【讨论】:

与 Python 3.8.10 相同的问题【参考方案2】:

您使用的是 Python 3.5。在 os 模块was added in Python 3.6 中支持Path objects。你可以:

要么升级到 Python 3.6;要么或

避免使用 Path 对象:

BASE_DIR = os.path.abspath(os.path.join(__file__, '../../../'))
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

【讨论】:

你是对的!我想升级到较新的版本,但运行 pip install --upgrade python 不会完成这项工作。我想我需要重新创建 virtualenv 谢谢,我有 python 3.9 但有这个问题,但按照你的回答,现在已经解决了!

以上是关于在服务器上运行 collectstatic:AttributeError:“PosixPath”对象没有属性“startswith”的主要内容,如果未能解决你的问题,请参考以下文章

使用 Django 存储和 S3 在 collectstatic 上出现 MemcachedError

Django,即使在 collectstatic 之后也没有提供 uwsgi 静态文件

为啥 iOS 14 ATT 提示无法在模拟器上运行?

使用docker将django应用程序部署到heroku时在哪里运行collectstatic?

部署到 Heroku 时 collectstatic 命令不运行,但设置非常好

当我将 Django 应用程序部署到 Heroku 时,为啥 collectstatic 不会自动运行?