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 代码,也可以在 运行 服务器时执行。这样您就可以再次验证代码是否正确写入。

很难说出问题到底是什么,但以下一些观察可能会有所帮助:

  1. STATIC_ROOT 仅用于 collectstatic。当您从命令行 (python -m django collectstatic) 运行 时,collectstatic 将在此处复制您的静态文件。
  2. STATIC_ROOT 不应包含在 STATICFILES_DIRS 中,因为这会使 collectstatic 感到困惑,因为它的工作是将静态文件从静态目录复制到 STATIC_ROOT
  3. AppDirectoriesFinder 将在每个应用程序下名为 static 的目录中查找静态文件。因此,例如,如果您的项目位于 /pycharmprojects/myapp/AppDirectoriesFinder 将在 /pycharmprojects/myapp/anapp/static/pycharmprojects/myapp/anotherapp/static 等目录中查找静态文件(对于 INSTALLED_APPS) 并将它们复制到 STATIC_ROOT.
  4. FileSystemFinder 将使用 STATICFILES_DIRS 中的值来查找静态文件并将它们复制到 STATIC_ROOT(这就是为什么 STATIC_ROOT 的值不应该被列入STATICFILES_DIRS).
  5. 在调试模式下,您不需要 collectstatic,因为 Django 会在原始位置查找文件,但在非调试模式下(DEBUG = False 在您的 Django 配置文件中),您将需要 运行 collectstatic 以便 Django 找到您的静态文件。

所以,据此,我建议:

  1. 绝对从您的 STATICFILES_DIR
  2. 中删除 os.path.join(PROJECT_ROOT, 'static')
  3. 如果 STATICFILES_DIR 指向与 os.path.join(PROJECT_ROOT, 'static')
  4. 相同的位置,可能会从您的 STATICFILES_DIR 中删除 /pycharmprojects/myapp/static
  5. 如果您没有 运行 处于调试模式(DEBUG = True 在您的 Django 配置文件中),请从命令行 运行 collectstatic 以便 Django 可以看到你的静态文件。

还有一个问题。您的 BASE_DIR 指向哪个目录?似乎 PROJECT_DIR 可能是多余的,因为它指向 BASE_DIR 通常指向的位置。

希望这面文字墙中的内容对您有所帮助。

干杯!