在我的本地Mac服务器上运行Django项目时,尝试访问静态文件时出现404错误。
我的目录结构如下:
myapp/static
在我的settings.py中,我尝试了以下各种组合:
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
STATICFILES_DIRS = [
os.path.join(PROJECT_ROOT, 'static'),
'/var/www/myapp/static',
'/pycharmprojects/myapp/static'
]
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'django.contrib.staticfiles.finders.FileSystemFinder',
)
对于静态文件的每次使用,我在PyCharm中都会出现这样的错误:
GET /static/img/pastedsvg%2017.svg HTTP/1.1" 404 101
在Firefox中出现如下错误:
GET
http://127.0.0.1:8888/static/img/pastedsvg%2017.svg [HTTP/1.0 404 NOT FOUND 15ms]
我已经在Stackoverflow中查看了这个问题的其他答案,并尝试了这些建议,但到目前为止没有任何效果。
答案 0 :(得分:8)
很难说出问题究竟是什么,但这里有一些可能有帮助的观察结果:
STATIC_ROOT
仅用于collectstatic
。当您从命令行(collectstatic
)运行静态文件时,python -m django collectstatic
将复制静态文件。STATIC_ROOT
不应包含在STATICFILES_DIRS
中,因为这会使collectstatic
混淆,因为它的作用是将静态文件从静态目录复制到STATIC_ROOT
。AppDirectoriesFinder
将在每个应用下的名为static
的目录中查找静态文件。因此,例如,如果您的项目位于/pycharmprojects/myapp/
,AppDirectoriesFinder
将在/pycharmprojects/myapp/anapp/static
和/pycharmprojects/myapp/anotherapp/static
等目录中查找静态文件(对于{{1}中列出的每个应用程序1}})并将它们复制到INSTALLED_APPS
。STATIC_ROOT
将使用FileSystemFinder
中的值来查找静态文件并将其复制到STATICFILES_DIRS
(这就是为什么不应列出STATIC_ROOT
的值在STATIC_ROOT
)。STATICFILES_DIRS
因为Django将在其原始位置查找文件,但是当不是调试模式(Django配置文件中的collectstatic
)时,您将需要运行DEBUG = False
以便Django找到您的静态文件。因此,我建议:
collectstatic
os.path.join(PROJECT_ROOT, 'static')
STATICFILES_DIR
指向与/pycharmprojects/myapp/static
STATICFILES_DIR
移除os.path.join(PROJECT_ROOT, 'static')
DEBUG = True
),请从命令行运行collectstatic
,以便Django可以看到您的静态文件。另一个问题。您的BASE_DIR
指向哪个目录?似乎PROJECT_DIR
可能是多余的,因为它指向BASE_DIR
通常指向的位置。
希望这篇文章中的内容会有所帮助。
干杯!
答案 1 :(得分:0)
我不知道以下是正确答案,但我希望它会顺利进行。
STATIC_URL = '/static/'
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
STATICFILES_DIRS = [
# os.path.join(PROJECT_ROOT, "static"),
os.path.join(BASE_DIR, "static"),
]
print("PROJECT_ROOT", PROJECT_ROOT)
print("BASE_DIR", BASE_DIR)
在这种情况下,名为 PROJECT_ROOT 的变量的值与存在设置文件的目录相同。 这就是为什么它不是 PROJECT_ROOT 的原因。
即使在设置文件中编写python-code,也可以在运行服务器时执行。因此,您可以再次验证代码是否已正确编写。