Django:静态图像不会加载

Django: Static Image won't load

我一直在严格按照官方文档进行操作,在这里尝试了一些相关问题的建议,并且只是在网上搜索一般,但我仍然没有运气来加载一张小图片。

我有一个名为 '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 调用,我什至尝试包括以下两行(正如我多次看到的建议) 在我的 urls.py:

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

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

编辑:抱歉,我做了一个类型,我的 settings.py 中有 STATIC_URL = '/static/' 和结束斜杠,为了澄清,我是 运行 这在我的开发版本中 python manage.py runserver

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

如果我记得,您需要在 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.[=21= 的文件夹中]

有关更深入的解释,请参阅 this answer:)

看起来您可能需要在您的 settings.py 中定义的变量 STATICFILES_DIRS,它应该包括 static 目录的位置 logo.png.

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

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


静态文件混乱

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

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

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

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

  • When someone accesses the path /static/ let them access the files in the following directory: /var/www/static/.

  • When someone accesses the path /, spin up this Python application that lives over here: /var/www/django-app.

Django 静态文件工具

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

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

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

开发中的静态文件

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

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

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

from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns()
  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

我什么都试过了,都没用。最后发现图像已损坏,因为我在 Visual Code 编辑器中将其作为字节打开。

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