Django:不会加载静态图像

2024-05-08 09:21:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在认真阅读官方文档,在这里尝试一些相关问题的建议,只是在网上搜索了一下,但仍然没有一个小图片可以加载。

我有一个名为“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.html是由project/mysite/app/views.py调用的,这当然是由project/mysite/app/urls.py调用的,我甚至尝试在我的urls.py结尾处包括以下两行(如我所见,建议了几次):

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

没什么用,那我做错什么了?

编辑:很抱歉,我做了一个类型,我有STATIC_URL = '/static/'settings.py中的右斜杠,为了澄清这一点,我正在用python manage.py runserver在我的dev build上运行这个

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


Tags: pyimageprojectappsettingspnghtmlstatic
3条回答
  1. 确保django.contrib.staticfiles包含在^{中。
  2. 在设置文件中,定义静态URL,例如: STATIC_URL = '/static/'
  3. 希望您将图像存储在/static/projectname/image.png文件夹中
  4. 最后在html中简单地添加以下内容

<img src="/static/projectname/image.png" alt="My image"/>

please refer django dcumentation

如果我还记得,您需要在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还是在生产站点上使用?

更新

下面是main 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:)

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

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

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


有关静态文件的混淆

Django和静态文件总是有很多混淆。我认为这种混乱来自于这样一个事实:Django在production中处理静态文件没有任何意义,但是在学习使用Django时以及在最初开发时使用它似乎是很自然的。

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

静态文件:web服务器的工作

有一些非常擅长服务静态文件的东西:web服务器本身(比如Apache、nginx等)。这就是他们的初衷。webserver可以运行Python/Django应用程序它只需找到一个文件并将其发送回去,因此通常通过如下方式配置webserver(在伪服务器语言中):

  • 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:服务器将为您的 静态文件。这只是为了当您使用static模板标记时,Django知道如何urlreverse它。换言之,这只是将{% static "..." %}转换为/static/...的一种便捷方式。
  • STATIC_ROOT:服务器上的位置(或 云某处),Django将把静态文件复制到其中,因此 你的服务器可以为他们服务。当你运行 collectstatic
  • STATICFILES_DIRS:任何额外的目录Django 应该在运行collectstatic时查找静态文件。由 默认Django只在每个应用程序的目录中查找static 目录(就像templates)。

开发中的静态文件

好吧,但这对开发没有多大帮助,因为您可能正在使用Django的runserver命令。您没有正在运行的服务器将为静态文件提供服务器。

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

DEBUG=True时,is a view会自动接收并提供静态文件。另外,这也是为什么有人可能使用以下内容:

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

相关问题 更多 >

    热门问题