Django: 收集静态文件时WinError 3

0 投票
2 回答
2967 浏览
提问于 2025-04-18 10:44

我遇到一个问题。当我从manage.py运行“collectstatic”时,它就给我报错,直接把我踢出去了,错误信息如下:

Traceback (most recent call last):
File "C:\Program Files (x86)\JetBrains\PyCharm 3.1.3\helpers\pycharm\django_manage.py",     line 23, in <module>
run_module(manage_file, None, '__main__', True)
File "C:\Python34\lib\runpy.py", line 182, in run_module
return _run_module_code(code, init_globals, run_name, mod_spec)
File "C:\Python34\lib\runpy.py", line 96, in _run_module_code
mod_name, mod_spec, pkg_name, script_name)
File "C:\Python34\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "C:/Users/mszalewski/PycharmProjects/OwnPixel_com\manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "C:\Python34\lib\site-packages\django\core\management\__init__.py", line 399, in execute_from_command_line
utility.execute()
File "C:\Python34\lib\site-packages\django\core\management\__init__.py", line 392, in  execute
 self.fetch_command(subcommand).run_from_argv(self.argv)
File "C:\Python34\lib\site-packages\django\core\management\base.py", line 242, in    run_from_argv
    self.execute(*args, **options.__dict__)
 File "C:\Python34\lib\site-packages\django\core\management\base.py", line 285, in execute
output = self.handle(*args, **options)
File "C:\Python34\lib\site-packages\django\core\management\base.py", line 415, in handle
return self.handle_noargs(**options)
File "C:\Python34\lib\site-packages\django\contrib\staticfiles\management\commands\collectstatic.py", line 173, in handle_noargs
collected = self.collect()
File "C:\Python34\lib\site-packages\django\contrib\staticfiles\management\commands\collectstatic.py", line 103, in collect
for path, storage in finder.list(self.ignore_patterns):
File "C:\Python34\lib\site-packages\django\contrib\staticfiles\finders.py", line 106, in list
for path in utils.get_files(storage, ignore_patterns):
File "C:\Python34\lib\site-packages\django\contrib\staticfiles\utils.py", line 25, in get_files
directories, files = storage.listdir(location)
File "C:\Python34\lib\site-packages\django\core\files\storage.py", line 250, in listdir
for entry in os.listdir(path):
FileNotFoundError: [WinError 3] Das System kann den angegebenen Pfad nicht finden: 'C:\\Users\\mszalewski\\PycharmProjects\\static\\static'

Process finished with exit code 1

这是我的settings.py文件:

import os
import os.path
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
DEBUG = True
TEMPLATE_DEBUG = True
ALLOWED_HOSTS = []
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
)

MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

ROOT_URLCONF = 'OwnPixel_com.urls'

WSGI_APPLICATION = 'OwnPixel_com.wsgi.application'
DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

STATIC_URL = '/static/'

TEMPLATE_DIRS = (
os.path.join(os.path.dirname(BASE_DIR), "static", "templates").replace('\\','/')
)

if DEBUG:
MEDIA_URL = '/media/'
STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), "static", "static-only").replace('\\', '/')
MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), "static", "media").replace('\\', '/')
STATICFILES_DIRS = (
    os.path.join(os.path.dirname(BASE_DIR), "static", "static").replace('\\', '/'),
)

还有我的扩展urls.py文件:

if settings.DEBUG:
urlpatterns += static(settings.STATIC_URL,
                        document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL,
                        document_root=settings.MEDIA_ROOT)

我很确定问题出在路径中的双反斜杠(错误代码的最后部分)。

我希望你能帮我解决这个问题。

谢谢!!!

祝好,Marvyn

2 个回答

0

因为你在一个虚拟目录里(假设你已经像这样激活了虚拟环境:source <*Scripts* or *bin*>/activate),所以STATIC_ROOTSTATICFILES_DIRS所期待的路径是不同的。


1) STATIC_ROOT是用来指向你本地机器上静态文件的位置的(这可以是你在开发的电脑,也可以是你在云服务器上提供这些文件的地方)——也就是说,像这样:STATIC_ROOT = 'C:/Users/<user>/Desktop/django_env_folder/mysite/static/mysite'

2) 而STATICFILES_DIRS则是期待虚拟环境的路径(记住,当你用上面的命令激活虚拟环境时,os.<method>()所需要的路径是不同的。你可以调试一下,试着运行os.listdir('C:/....'),你会发现结果和预期的不一样。所以对于STATICFILES_DIRS可以试试这样——> STATICFILES_DIRS = [ 'mysite/static/mysite', ]


** 这个解决方案在localhost上运行时肯定有效,确保在你的settings.pyDebug = True

2

你的文件夹结构到底是什么样的呢?

我怀疑 'C:\Users\mszalewski\PycharmProjects\static\static' 这个文件夹不是你想用来放项目特定静态文件的地方。

我猜你是想把

os.path.join(os.path.dirname(BASE_DIR), "static", "static").replace('\\', '/')

改成

os.path.join(BASE_DIR, "static", "static")

或者类似的东西。别担心 '\\' 和 '/' 的问题,Python 在同一路径中可以处理这些奇怪的组合。

撰写回答