Django 为静态文件返回 404
Django returning 404 for static files
当 运行 我的本地 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]
我已经在 Whosebug 中查看了这个问题的其他答案并尝试了这些建议,但到目前为止没有任何效果。
不知道下面的答案是否正确,希望一切顺利
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 代码,也可以在 运行 服务器时执行。这样您就可以再次验证代码是否正确写入。
很难说出问题到底是什么,但以下一些观察可能会有所帮助:
STATIC_ROOT
仅用于 collectstatic
。当您从命令行 (python -m django collectstatic
) 运行 时,collectstatic
将在此处复制您的静态文件。
STATIC_ROOT
不应包含在 STATICFILES_DIRS
中,因为这会使 collectstatic
感到困惑,因为它的工作是将静态文件从静态目录复制到 STATIC_ROOT
。
AppDirectoriesFinder
将在每个应用程序下名为 static
的目录中查找静态文件。因此,例如,如果您的项目位于 /pycharmprojects/myapp/
,AppDirectoriesFinder
将在 /pycharmprojects/myapp/anapp/static
和 /pycharmprojects/myapp/anotherapp/static
等目录中查找静态文件(对于 INSTALLED_APPS
) 并将它们复制到 STATIC_ROOT
.
FileSystemFinder
将使用 STATICFILES_DIRS
中的值来查找静态文件并将它们复制到 STATIC_ROOT
(这就是为什么 STATIC_ROOT
的值不应该被列入STATICFILES_DIRS
).
- 在调试模式下,您不需要
collectstatic
,因为 Django 会在原始位置查找文件,但在非调试模式下(DEBUG = False
在您的 Django 配置文件中),您将需要 运行 collectstatic
以便 Django 找到您的静态文件。
所以,据此,我建议:
- 绝对从您的
STATICFILES_DIR
中删除 os.path.join(PROJECT_ROOT, 'static')
- 如果
STATICFILES_DIR
指向与 os.path.join(PROJECT_ROOT, 'static')
相同的位置,可能会从您的 STATICFILES_DIR
中删除 /pycharmprojects/myapp/static
- 如果您没有 运行 处于调试模式(
DEBUG = True
在您的 Django 配置文件中),请从命令行 运行 collectstatic
以便 Django 可以看到你的静态文件。
还有一个问题。您的 BASE_DIR
指向哪个目录?似乎 PROJECT_DIR
可能是多余的,因为它指向 BASE_DIR
通常指向的位置。
希望这面文字墙中的内容对您有所帮助。
干杯!
当 运行 我的本地 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]
我已经在 Whosebug 中查看了这个问题的其他答案并尝试了这些建议,但到目前为止没有任何效果。
不知道下面的答案是否正确,希望一切顺利
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 代码,也可以在 运行 服务器时执行。这样您就可以再次验证代码是否正确写入。
很难说出问题到底是什么,但以下一些观察可能会有所帮助:
STATIC_ROOT
仅用于collectstatic
。当您从命令行 (python -m django collectstatic
) 运行 时,collectstatic
将在此处复制您的静态文件。STATIC_ROOT
不应包含在STATICFILES_DIRS
中,因为这会使collectstatic
感到困惑,因为它的工作是将静态文件从静态目录复制到STATIC_ROOT
。AppDirectoriesFinder
将在每个应用程序下名为static
的目录中查找静态文件。因此,例如,如果您的项目位于/pycharmprojects/myapp/
,AppDirectoriesFinder
将在/pycharmprojects/myapp/anapp/static
和/pycharmprojects/myapp/anotherapp/static
等目录中查找静态文件(对于INSTALLED_APPS
) 并将它们复制到STATIC_ROOT
.FileSystemFinder
将使用STATICFILES_DIRS
中的值来查找静态文件并将它们复制到STATIC_ROOT
(这就是为什么STATIC_ROOT
的值不应该被列入STATICFILES_DIRS
).- 在调试模式下,您不需要
collectstatic
,因为 Django 会在原始位置查找文件,但在非调试模式下(DEBUG = False
在您的 Django 配置文件中),您将需要 运行collectstatic
以便 Django 找到您的静态文件。
所以,据此,我建议:
- 绝对从您的
STATICFILES_DIR
中删除 - 如果
STATICFILES_DIR
指向与os.path.join(PROJECT_ROOT, 'static')
相同的位置,可能会从您的 - 如果您没有 运行 处于调试模式(
DEBUG = True
在您的 Django 配置文件中),请从命令行 运行collectstatic
以便 Django 可以看到你的静态文件。
os.path.join(PROJECT_ROOT, 'static')
STATICFILES_DIR
中删除 /pycharmprojects/myapp/static
还有一个问题。您的 BASE_DIR
指向哪个目录?似乎 PROJECT_DIR
可能是多余的,因为它指向 BASE_DIR
通常指向的位置。
希望这面文字墙中的内容对您有所帮助。
干杯!