【问题标题】:I keep getting a 404 error when django is looking for static files当 django 查找静态文件时,我不断收到 404 错误
【发布时间】:2019-12-06 13:25:24
【问题描述】:

当 django 查找静态文件时,我不断收到 404 错误。

settings.py

STATIC_ROOT = os.path.join(BASE_DIR, 'business', 'static_cdn')
STATIC_URL = '/static_cdn/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'business', 'static'),
]

应用的项目树结构

- business
-- migrations
--- ....
-- static_cdn
--- business
---- main.css
---- scripts.js
-- templates
--- business
---- base.html
---- home.html
-- templatetags
--- ...
-- __init__.py
-- admin.py
-- apps.py
-- models.py
-- tests.py
-- urls.py
-- views.py

错误

[29/Jul/2019 13:09:45] "GET / HTTP/1.1" 200 12670
[29/Jul/2019 13:09:45] "GET /static_cdn/business/main.css HTTP/1.1" 404 77
[29/Jul/2019 13:09:45] "GET /static_cdn/business/scripts.js HTTP/1.1" 404 77

我还链接到像 {% static 'business/main.css' %} 这样的静态文件,我的文档顶部确实有 {% load static %}

为什么 django 找不到静态文件?该错误表示它正在寻找正确的位置,但它返回 404 错误。

如果你还有什么需要,可以看我的code

注意: 我认为 django 无法读取这些文件,但我不知道为什么... Collectstatic 将所有 static_cdn/ 放入同一应用程序目录中的 static/ .

【问题讨论】:

  • 是否有可能将 DEBUG 设置为 False?
  • @Amit 是的
  • 只有在开发环境而非生产环境中才尝试将其更改为 True。
  • @Amit 我正在尝试将其推送到 heroku,那里也会发生完全相同的事情,对吧?
  • 对于生产,您可能必须先运行 collectstatic。如果您正在推动生产,切勿将 DEBUG 设置为 True。请仔细查看 Dango 文档进行部署。这不是很难,但也不是微不足道的。当心。暂时为“本地”测试将 DEBUG 设置为 True。一切顺利。

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


【解决方案1】:

您可能已将 DEBUG 设置为 False。当且仅当您在开发环境中时,将 DEBUG 设置为 True。如果您计划生产,请先进行 collectstatic 并在 settings.py 中进行适当的更改并将 DEBUG 设置回 False。请参阅 Django 文档和您的生产服务器文档。也不要忘记重新启动服务器。 最良好的祝愿。

【讨论】:

    【解决方案2】:

    在您的代码中,您已将 BASE_DIR 定义如下

    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    

    这意味着它指向根文件夹,而您的 static_cdn 文件夹位于 business 文件夹下

    在下面定义时,您必须更新 STATIC_ROOTSTATICFILES_DIRS

    的业务文件夹中的路径
    STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'static_cdn')
    STATIC_URL = '/static_cdn/'
    
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'static_cdn'),
    ]
    

    如下

    STATIC_ROOT = os.path.join(BASE_DIR, 'business', 'static')
    STATIC_URL = '/static_cdn/'
    
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'business', 'static_cdn'),
    ]
    

    【讨论】:

    • 可以,但是 STATICFILES_DIRS 不能和 STATIC_ROOT 一样
    • 仅供参考。在您的情况下,将 STATIC_ROOT 更改为您将在使用命令“collectstatic”后在生产中使用的东西。例如 - STATIC_ROOT 可以设置为“static”,而 rest 可以指向“static_cdn”。在这种情况下,当执行 collectstatic 命令时,所有资源都会被复制到“static”文件夹中。
    • 哦,好吧,是的。我已经这样做了!我完全知道你要说什么:D
    【解决方案3】:

    将您的静态文件夹重命名为 static_cdn 并更新 settings.py

    settings.py

    STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'static_cdn')
    STATIC_URL = '/static_cdn/'
    
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'static_cdn'),
    ]
    

    即这个结构:

    应用的项目树结构

    - business
    -- migrations
    --- ....
    -- static_cdn
    --- business
    ---- main.css
    ---- scripts.js
    -- templates
    --- business
    ---- base.html
    ---- home.html
    -- templatetags
    --- ...
    -- __init__.py
    -- admin.py
    -- apps.py
    -- models.py
    -- tests.py
    -- urls.py
    -- views.py
    

    【讨论】:

    • 我在问过这个问题后就试过了。它没有工作:(
    • @12944qwerty 您是否也更改了 settings.py 以使用 static_cdn 而不是 static ?更新了答案。
    • 哦,我刚刚意识到一个错误。是STATIC_ROOT = os.path.join(BASE_DIR,'static_cdn'),这意味着我不能让 STATIC_DIRS 包含这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 2021-11-25
    • 1970-01-01
    • 2016-04-08
    • 2018-05-24
    相关资源
    最近更新 更多