【问题标题】:how to point correctly to static image in django如何正确指向 Django 中的静态图像
【发布时间】:2014-05-07 03:55:03
【问题描述】:

我有一个渲染图像的模板:

{% load staticfiles %}

<img src="{% static "img/logo.png" %}" alt="My image"/>

图片链接坏了,但它指向:

localhost/static/img/logo.png

我需要为 static_root、static_url 和 STATICFILES_DIRS 设置哪些值才能正确显示此图像?

这是我的目录结构:

我的项目名称(顶级)

--- 我的项目名称

--- --- 我的项目名称

--- --- --- 设置

--- --- --- --- base.py (setting.py)

--- --- 静态

--- --- --- 图像

这是我在设置中的静态配置:

STATIC_ROOT = '/Users/myuser/myprojectname/myprojectname'
STATIC_URL = '/static/'

STATICFILES_DIRS = (
    #normpath(join(SITE_ROOT, 'static')),
    os.path.join(BASE_DIR, "static"),
    '/Users/myuser/myprojectname/myprojectname/static',
)

这是它显示的内容:

我已经做了一个collectstatic,但这不起作用。

【问题讨论】:

  • 您的网络服务器环境是什么?您是在运行manage.py runserver,还是有合适的网络服务器? Django 通常根本不提供静态文件,你必须设置你的网络服务器来直接提供它们,除非你运行manage.py runserver,它确实 提供静态文件(因为你没有网络服务器在这种情况下承担责任)
  • 我正在本地机器上运行 manage.py。根据这个在 dev 中运行将提供文件:docs.djangoproject.com/en/1.6/howto/static-files
  • 除了 STATIC_URL 和 STATICFILES_DIRS 的设置之外,您还需要发布应用的目录结构来诊断问题。
  • @Brandon 我已经添加了目录结构和设置配置。

标签: django django-templates django-staticfiles django-settings


【解决方案1】:

【讨论】:

    【解决方案2】:

    如果您处于开发模式,则只定义一行:

    STATICFILES_DIRS = ( os.path.join('static'), )
    

    你不需要定义 STATIC_ROOT = '/Users/myuser/myprojectname/myprojectname'

    STATICFILES_DIRS 作为 BASE_DIR

    所以,可行的解决方案是:

    STATIC_URL = '/static/'
    
    STATICFILES_DIRS = ( os.path.join('static'), )
    

    【讨论】:

      【解决方案3】:

      在您的项目根目录中设置“staticfiles”文件夹,其中 settings.py 存在

      在静态文件中你可以这样..

      • CSS
      • js
      • 图片

      在settings.py中

      STATIC_ROOT = os.path.join(PROJECT_DIR,'static')
      STATIC_URL = '/static/'
      
      STATICFILES_DIRS = (
                      os.path.join(PROJECT_DIR,'staticfiles'), # if your static files folder is named "staticfiles"
      )
      TEMPLATE_DIRS = (
                      os.path.join(PROJECT_DIR,'template'), # if your static files folder is named "template"
      )
      

      在base.html中

      <link rel="stylesheet" type="text/css" href="{% static 'css/demo.css' %}" /> 
      
      <script type="text/javascript" src="{% static 'js/jquery.min.js' %}"></script>
      

      在包含 base.html 的其他模板文件中

      {% extends "base.html" %}
      {% load static %}
      
      
      <script type="text/javascript" src="{% static 'js/jquery.min.js' %}"></script>
      
      
      <div id="yourID" class="yourClass">
          <img src="{% static "images/something.gif" %}" alt="something" >
      </div>
      

      【讨论】:

      • 即使您计划在 heroku、app engine 或 aws 上部署您的应用程序,这也会有所帮助..
      【解决方案4】:

      静态文件在 Django 中可能会令人困惑。我会尽量解释清楚...

      STATIC_ROOT 这是您应该在生产中提供静态文件的目录。

      STATICFILES_DIRS 这是您应该在开发中提供静态文件的目录。

      STATIC_ROOT 和 STATICFILES_DIRS 不能指向同一个目录。

      Django 是一个高度模块化的框架。一些应用程序模块包含它们自己的模板、css、图像和 JavaScript。 Django admin 就是这样一款应用程序。 Django 通过在开发和生产中使用不同的静态文件目录将这种模块化扩展到您创建的应用程序。

      DEBUG = True 并且您在INSTALLED_APPS 中包含django.core.staticfiles 时,Django 将使用STATIC_URL 路径作为起点来提供位于STATICFILES_DIRS 元组中的文件。

      在生产中这个责任应该交给 Nginx、Apache、CloudFront 等。DEBUG = False 时,Django 不会自动提供任何静态文件。

      当你运行时:

      $ python manage.py collectstatic
      

      将 STATICFILES_DIRS 中指定的文件复制到要部署的 STATIC_ROOT 中。

      所以,为了回答你的问题,我会做以下事情:

      创建另一个目录来存储您在开发中的静态文件,并将该路径添加到您的 STATICFILES_DIRS。我通常将此文件夹称为“静态资产”。它可以与您现有的“静态”目录位于同一级别。

      将 STATIC_ROOT 设置为现有“静态”目录的路径。

      如果您仔细查看屏幕截图中返回 404 的路径,则图像路径指定为:/static/img/logo.png,但您的图像目录是:/static/image/

      因此,请仔细检查您的图像路径以确保您指向正确的目录。

      【讨论】:

      • 谢谢,请添加更多信息,因为这是 django 中非常困难的主题之一
      • 不客气。 django的设置很多,静态文件让我绊倒了不止几次。
      • 感谢您的评论。在文档中找到如此清晰的解释非常困难。
      • 非常感谢布兰登。我永远无法理解。
      • 是的,根据需要添加路径到STATICFILES_DIRS 是开发的方式。当你想部署时,你可以回顾这个变量来查看开发遗留的路径并清理它们。这有助于您在开发过程中保持井井有条,在生产过程中保持清洁。
      猜你喜欢
      • 2021-12-19
      • 2012-10-20
      • 2010-12-02
      • 1970-01-01
      • 2019-04-16
      • 2011-01-21
      • 2018-02-11
      • 2012-11-10
      • 1970-01-01
      相关资源
      最近更新 更多