【问题标题】:Django: Static Image won't loadDjango:静态图像不会加载
【发布时间】:2022-02-02 11:40:21
【问题描述】:

我一直在关注官方文档,在此处尝试针对相关问题的一些建议,并且只是在一般情况下搜索网络,但我仍然无法加载一张小图片。

我有一个名为“logo.png”的图像,我的项目层次结构如下所示:

project/
   mysite/
      app/
         __init__.py
         admin.py
         models.py
         urls.py
         view.py
      mysite/
         __init__.py
         settings.py
         urls.py
         views.py
         wsgi.py
      static/
         logo.png
      templates/
         index.html
         calling_image.html

settings.py里面我有STATIC_URL = '/static/'

calling_image.html里面我有<img src="/static/logo.png">

我的模板calling_image.htmlproject/mysite/app/views.py 调用,当然随后由project/mysite/app/urls.py 调用,我什至尝试在@987654330 的末尾包含以下两行(正如我多次看到的那样) @:

from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns()

没有任何效果,那我做错了什么?

编辑:对不起,我做了一个类型,STATIC_URL = '/static/' 在我的settings.py 中有结束斜线,为了澄清起见,我正在使用python manage.py runserver 在我的开发版本上运行它

已解决:所以我最终自己解决了这个问题。我在project/mysite/ 中创建了一个目录resources 并将logo.png 放在那里。然后我设置STATICFILES_DIRS = (os.path.join(BASE_DIR, "resources"),) 并运行collecstatic,一切正常!不需要使用urlpatterns += staticfiles_urlpatterns() 之类的。

【问题讨论】:

  • 引用静态文件的正确语法是<img src="{% static "logo.png" %}">,假设 logo.png 位于您的顶级静态文件夹中。 (另见this part of the tutorial)。
  • 也许他需要“rendre_to_response”
  • 尝试关闭STATIC_URL = '/static/'的路径并运行python manage.py collectstatic
  • 确保您在设置文件中定义了STATIC_ROOT
  • 对不起,我打错了,我确实关闭了STATIC_URL 的路径。我将STATIC_ROOT 设置为什么?

标签: python django django-staticfiles


【解决方案1】:

看起来您可能需要在您的 settings.py 中定义的变量 STATICFILES_DIRS 并且应该包括包含 logo.pngstatic 目录的位置。

默认情况下,Django 仅在 每个应用程序 内的 static 目录中查找静态文件。如果您在任何应用程序之外有静态文件,collectstatic 不会自动获取它。

https://docs.djangoproject.com/en/1.8/ref/settings/#std:setting-STATICFILES_DIRS


围绕静态文件的困惑

关于 Django 和静态文件总是有很多混淆。我相信这种困惑来自这样一个事实,即 Django 在生产 中处理静态文件没有任何意义,但在学习使用 Django 时以及因此在最初开发时使用它似乎很自然。

Django 提供静态文件没有任何意义的原因是 Django 是一个用于呈现动态响应的框架。 “静态”文件不是动态的:它们不会改变。因此,启动一个调用所有 Django 机器的 Python 应用程序只是为了查找并返回一个没有动态内容的文件,这是一种巨大的资源浪费。

静态文件:网络服务器的工作

有一些东西非常擅长提供静态文件:网络服务器本身(例如 Apache、nginx 等)。这就是他们的设计目的。网络服务器可以运行 Python/Django 应用程序它可以定位一个文件并将其发回,因此您通常通过告诉它以下内容来配置网络服务器(在伪服务器语言中):

  • 当有人访问路径/static/时,让他们访问其中的文件 以下目录:/var/www/static/

  • 当有人访问 路径/,启动这里的 Python 应用程序: /var/www/django-app

Django 静态文件工具

因此,Django 附带了一些管理静态文件的辅助工具,以便您的实际服务器可以为它们提供服务。

这些工具如下(定义在settings.py):

  • STATIC_URL:您的服务器将为您提供服务的 URL 路径 静态文件。这只是为了当你使用static 模板标签时,Django 知道如何urlreverse 它。换句话说,这只是将{% static "..." %} 转换为/static/... 的一种便捷方式。
  • STATIC_ROOT: 你服务器上的地方(或在 云某处),Django 将复制你的静态文件,所以 你的服务器可以为他们服务。运行时会发生这种复制 collectstatic
  • STATICFILES_DIRS: 任何额外的目录 Django 每次运行collectstatic 时都应该查找静态文件。经过 默认 Django 仅在每个应用程序的目录中查找 static 目录(就像 templates 一样)。

开发中的静态文件

好的,但这在您可能正在使用 Django 的 runserver 命令的开发中没有太大帮助。您没有正在运行的服务器来处理静态文件。

因此,在这种情况下,您可以要求 Django 也为您提供服务器静态文件,因为您正在开发应用程序并且不想运行单独的服务器。

is a view 会在DEBUG=True 时自动获取并提供静态文件。或者,这也是有人可能会使用以下内容的原因:

from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns()

【讨论】:

  • 要扩展此评论,请参阅 this link 了解这与 STATIC_URLSTATIC_ROOT 的关系。
  • 有趣的是,我最终自己解决了这个问题(我用我的解决方案更新了我的 OP)并且想知道为什么我不需要运行最后一点代码,将模式附加到 urlpatterns。非常感谢您澄清其他一切!
  • 很好!我认为这是因为如果您在DEBUG=True 模式下运行,则有一个视图是automatically enabled。文档说您只需要urlpatterns,“要在不同的本地开发服务器上使用视图...”。
【解决方案2】:
  1. 确保django.contrib.staticfiles 包含在您的INSTALLED_APPS 中。
  2. 在您的设置文件中,定义 STATIC_URL,例如: STATIC_URL = 'static/'
  3. 希望您将图像存储在文件夹projectname/static/appname/images/image.png
  4. 最后在您的 html 中添加以下内容

<img src="appname/images/image.png" alt="My image"/>

please refer django dcumentation

【讨论】:

    【解决方案3】:

    如果我记得,您需要在settings.py 中指定STATIC_ROOT = 'static',并且您需要有一个URL 将/static 指向您的静态文件。像这样。

    urlpatterns += patterns('',
        (r'^static/(?P<path>.*)$', 'django.views.static.serve', {
            'document_root': settings.STATIC_ROOT, 'show_indexes': True
        }),
    )
    

    这可能有点过时,但对我仍然有效。

    另外,您是想通过 python manage.py runserver 在您的开发网站上使用它还是在生产网站上使用它?

    更新

    这是一个主要 urls.py 文件的示例。

    from django.conf.urls import patterns, include, url
    
    urlpatterns = (
        url(r'^admin/', include(admin.site.urls)),
        # more urls...
    )
    
    #The following enable structural 'static' files while in development mode.
    if settings.DEBUG:
        urlpatterns += patterns('',
            (r'^static/(?P<path>.*)$', 'django.views.static.serve', {
                'document_root': settings.STATIC_ROOT, 'show_indexes': True
            }),
        )
    

    patterns 在 urls.py 文件顶部附近导入。

    这就是STATIC_ROOT 发挥作用的地方。

    您可能还需要运行python manage.py collectstatic,以便从您的各种应用程序中收集静态文件并将其复制到STATIC_ROOT 文件夹中。

    请参阅this answer 以获得更深入的解释 :)

    【讨论】:

    • 我有两个问题:pattern 是从哪里定义/导入的,我如何正确地将settings.py 导入我的urls.py(以及哪个urls.py?使用我猜是模板?)
    • 我也在我的开发网站上运行这个
    • STATIC_ROOT 是一个仅用于收集静态文件以在生产环境中查找的参数。我相信您正在考虑STATIC_URL,这是OP的问题中提到的。
    【解决方案4】:

    我尝试了一切,但没有任何效果。最后发现图像已损坏,因为我在 Visual Code 编辑器中将其作为字节打开。

    上传了新图片,一切正常。

    【讨论】:

      猜你喜欢
      • 2017-04-08
      • 1970-01-01
      • 2012-04-30
      • 1970-01-01
      • 2020-10-21
      • 2019-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多