Django为静态文件返回404

Bil*_*ble 1 python django http-status-code-404

在我的本地Mac服务器上运行Django项目时,在尝试访问静态文件时出现404错误.

我的目录结构如下:

myapp/static
Run Code Online (Sandbox Code Playgroud)

在我的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',
)
Run Code Online (Sandbox Code Playgroud)

对于静态文件的每次使用,我在PyCharm中得到如下错误:

GET /static/img/pastedsvg%2017.svg HTTP/1.1" 404 101
Run Code Online (Sandbox Code Playgroud)

在Firefox中出现如下错误:

GET 
http://127.0.0.1:8888/static/img/pastedsvg%2017.svg [HTTP/1.0 404 NOT FOUND 15ms]
Run Code Online (Sandbox Code Playgroud)

我已经在Stackoverflow中查看了这个问题的其他答案,并尝试了建议,但到目前为止没有任何作用.

Caf*_*led 8

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

  1. STATIC_ROOT仅用于collectstatic.collectstatic从命令行(python -m django collectstatic)运行它时,它将复制静态文件.
  2. STATIC_ROOT不应该被列入STATICFILES_DIRS,因为这会混淆collectstatic,因为它的工作是静态文件从您的静态目录复制STATIC_ROOT.
  3. AppDirectoriesFinderstatic在每个应用程序下调用的目录中查找静态文件.因此,例如,如果您的项目位于其中/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. 绝对os.path.join(PROJECT_ROOT, 'static')从你的.删除STATICFILES_DIR
  2. 如果指向同一位置,可能会/pycharmprojects/myapp/static从您STATICFILES_DIR的位置删除os.path.join(PROJECT_ROOT, 'static')
  3. 如果您没有在调试模式下运行(DEBUG = True在Django配置文件中),请从命令行运行collectstatic,以便Django可以看到您的静态文件.

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

希望这一文本墙中的某些内容会有所帮助.

干杯!