Django为静态文件返回404

时间:2016-02-26 12:09:55

标签: python django http-status-code-404

在我的本地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中查看了这个问题的其他答案,并尝试了这些建议,但到目前为止没有任何效果。

2 个答案:

答案 0 :(得分:8)

很难说出问题究竟是什么,但这里有一些可能有帮助的观察结果:

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

    1. 绝对从collectstatic
    2. 中删除os.path.join(PROJECT_ROOT, 'static')
    3. 如果STATICFILES_DIR指向与/pycharmprojects/myapp/static
    4. 相同的位置,可能会从STATICFILES_DIR移除os.path.join(PROJECT_ROOT, 'static')
    5. 如果您没有在调试模式下运行(Django配置文件中为DEBUG = True),请从命令行运行collectstatic,以便Django可以看到您的静态文件。
    6. 另一个问题。您的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,也可以在运行服务器时执行。因此,您可以再次验证代码是否已正确编写。