【问题标题】:Unable to load static files in Django Production无法在 Django Production 中加载静态文件
【发布时间】:2020-02-19 18:49:14
【问题描述】:

我正在尝试使用 DEBUG=False 运行应用程序

下面是我的设置文件配置

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

STATIC_URL = '/static/'

STATICFILES_DIRS = [os.path.join(BASE_DIR, "static/")]

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles/')

运行python manage.py collectstatic后,将app路径下的所有静态文件复制到staticfiles目录下(STATIC_ROOT路径中提到)。

加载网页时,静态文件加载失败。

错误信息:

GET /static/dist/bootstrap-4.0.0-dist/js/bootstrap.min.14d449eb8876.js HTTP/1.1" 404 77

GET /静态/dist/bootstrap-select/js/bootstrap-select.min.31f649694651.js HTTP/1.1" 404 77

GET /静态/js/base.1332bbb46ac5.js HTTP/1.1" 404 77

GET /静态/crsummary/dist/amcharts4/core.ea1ec0eb6727.js HTTP/1.1" 404 77

查看错误消息,应用程序正在尝试从路径/static/\*/\* 加载bootstrap.min.14d449eb8876.js,但实际文件位置是staticfiles/\*/\*

我不确定我在这里错过了什么配置。

【问题讨论】:

  • 您使用的是哪个网络服务器? Nginx 还是 Apache?如果您可以提供网络服务器的配置,它会有所帮助
  • 不生产时静态文件在哪里?它们不在名为static/ 的文件夹中吗? python manage.py collectstatic 只是将所有静态文件放入一个文件夹(在您的情况下为staticfiles/),但这并不意味着它们将从那里得到服务。正如@ToanQuocHo 所问,您使用的是哪个服务器?
  • 我没有使用任何像 Apache 这样的外部 Web 服务器,但我尝试使用开发服务器本身(由 Django 提供)来测试 DEBUG=False 是否有效。我在 ALLOWED_HOST 中给出了我的计算机的 IP 地址。如果我们在生产中部署 Django 时不使用任何外部 Web 服务器,是否会出现此错误?
  • 它不会按您的预期工作,并且在使用runserver 命令运行时对您的应用非常不利。如果您仍然想遵循这种方式,请确保您的 urls.py 上的静态 url 配置没有留在 if settings.DEBUG: 条件块内。但我真的不建议你尝试这个。
  • 我认为在runserver中运行时必须设置DEBUG=True。请阅读docs.djangoproject.com/en/2.2/howto/static-files

标签: python django django-staticfiles


【解决方案1】:

Django 不允许在生产代码时加载静态文件,而不是使用 aws 或任何其他在线内容交付网络

如果你真的不想从代码目录加载静态文件,你需要安装whitenoise,并在你的中间件、静态文件和installed_apps中定义它

更多你可以在 django 中搜索使用和设置 whitenoise

【讨论】:

    【解决方案2】:
    {% load staticfiles %}
    <link rel="stylesheet" type="text/css" href=" {%static 'app1/css/freelancer.css' %}" />
    

    像这样加载静态文件。

    {% load static %}
    <img class="img-fluid" src="{% static 'app1/img/portfolio/ai.png' %}" alt="">
    

    像这样加载图像。

    在此之前,需要指定基本目录和静态目录

    STATIC_DIR=os.path.join(BASE_DIR,"static")
    
    STATIC_URL = '/static/'
    STATICFILES_DIRS=[STATIC_DIR,]
    

    基础目录

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

    像这样在项目中构建路径:os.path.join(BASE_DIR, ...)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-12
      • 2014-09-03
      • 1970-01-01
      • 2014-07-12
      • 2018-03-19
      • 2015-12-17
      相关资源
      最近更新 更多