Django 在生产中找不到通过 CSS 文件链接的图像

Posted

技术标签:

【中文标题】Django 在生产中找不到通过 CSS 文件链接的图像【英文标题】:Django is not finding images linked via CSS file when in production 【发布时间】:2020-04-02 16:12:17 【问题描述】:

我已经通过 Digital Ocean 部署了一个 Django 2.2 项目,可以在 www.fancyfetish.co.uk 找到它

如果您访问该网站,它看起来很糟糕,缺少很多图片和样式。在开发中不是这种情况。当我使用 chrome 开发工具检查控制台时,在检索已从 CSS 文件调用的图像以及大量 CSS 样式时出现 404 错误。

从我的 CSS 文件中找到一个根本没有呈现的代码 sn-p:

.showcase 
  min-height: 40rem;
  position: relative;
  display: table;
  width: 100%;
  height: auto;
  padding-top: 15rem;
  padding-bottom: 10rem;
  background-image: url("/static/baseapp/img/fancy_fetish_showcase.png/");
  background-position: center 50px;
  background-repeat: no-repeat;
  background-size: cover; 
 

  .showcase h3 
    font-family: 'Cinzel', serif; 
  

  .showcase h1 
    font-family: 'Cinzel', serif; 
  

  .showcase a 
    font-family: 'Peddana', serif;
    font-size: 1.5rem; 
  

如本节所示,我清楚地将背景图像链接回图像文件夹。我指定的特定图像文件夹是我使用 collectstatic 时所有静态文件所在的文件夹。

404 错误说:

http://fancyfetish.co.uk/static/baseapp/css/fancy_fetish_showcase.png

所以它试图在 css 文件中找到 CSS 图像,但是它位于静态的 img 文件夹中。

这是我的 django 模板中的链接:

<link rel="stylesheet" type="text/css" href="% static 'baseapp/css/style.css' %">
<link rel="stylesheet" type="text/css" href="% static 'baseapp/css/bootstrap.css' %">

这是目录:

在应用程序内有一个购物车应用程序、一个用户应用程序、一个产品应用程序和一个基本应用程序,我在其中保留所有静态文件夹,并从其他应用程序链接回所有这些文件夹,因此我没有在每个应用程序中都有静态文件应用程序。

我的设置文件如下所示:


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

STATICFILES_DIRS = [
    'apps/baseapp/static'
]

STATIC_URL = '/static/'

上面目录图中的主静态目录是 collectstatic 将所有内容移动到的地方,它看起来像这样:

在主目录中找到的媒体文件是通过数据库上传的图像所在的位置,如下所示在我的一个模型中:

class ToyProduct(models.Model):

    slug = models.SlugField(max_length=40)
    image = models.ImageField(upload_to='media')
    title = models.CharField(max_length=150)
    description = models.TextField()
    price = models.DecimalField(max_digits=5, decimal_places=2)
    stock_quantity = models.PositiveIntegerField()
    in_stock = models.BooleanField(default=True)
    category = models.CharField(choices=TOY_CATEGORY_CHOICES, max_length=2, default='FW')
    brand = models.CharField(choices=TOY_BRAND_CHOICES, max_length=2, default='NB')
    on_sale = models.BooleanField(default=False)

    def __str__(self):
        return self.title

我将我的 css 写入一个 SCSS 文件,然后 Koala 开发工具编译为 css,然后将其收集到静态文件夹中。

我很确定这是一件非常明显的事情,而且我对它的研究太过分了,或者我的设置中的静态文件有误。有人可以帮忙吗?

非常感谢!

卡莉

【问题讨论】:

您选择了哪个 Web 服务器,并且您是否已将其配置为提供静态文件? Django 不仅仅像在开发中那样在生产环境中提供文件。 我正在通过数字海洋和 nginx 使用 Ubuntu,我认为 CSS 存在问题,因为其他静态文件和我的 bootstrap.css 文件似乎加载正常 如果我查看 'style.css' 文件,网址与您在此处显示的不同。这是background-image: url("fancy_fetish_showcase.png");。 css 文件中的 url 总是相对于 css 文件本身的位置。将其更改为url("../img/fancy_fetish_showcase.jpg") 请注意,如果 baseapp 是您的 Django 应用程序之一,Django 已经在 baseapp/static/ 目录中查找文件,因此您无需将其添加到 STATICFILES_DIRS,如 @987654326 所述@ 还要注意媒体文件被上传到MEDIA_ROOT(在你的设置中),所以如果MEDIA_ROOT是某个名为“媒体”的文件夹,你不应该upload_to='media'因为那会上传path/to/media/media 中的文件,即。两次“媒体”。 【参考方案1】:

我发现了这个问题,服务器正在通过 GIT 访问我的旧版本的 css 文件。我重新克隆到 repo,它更新到我最新的 CSS 工作版本,现在一切正常

【讨论】:

【参考方案2】:

url() 在 css 文件中始终使用 相对于 css 文件本身位置的路径

您的 style.css 文件包含 background-image: url("fancy_fetish_showcase.png");,因此您的浏览器将在与 css 文件 (/static/baseapp/css) 相同的文件夹中查找此文件。

您应该将其替换为 url("../img/fancy_fetish_showcase.jpg") 以使其在 /static/baseapp/img 中查找。

【讨论】:

以上是关于Django 在生产中找不到通过 CSS 文件链接的图像的主要内容,如果未能解决你的问题,请参考以下文章

错误:在生产中启动 ApolloServer for Express 时找不到模块/ApolloServer/protobufjs/minimal

使 django url 标签静默失败

Django 2.2静态文件在生产中不起作用(DEBUG False)[重复]

在生产中使用实体框架(代码优先)迁移

Django - 在此服务器上未在生产中找到资源

如何修复生产中找不到的 vue 动态异步组件?