【问题标题】:Django static files, and filepaths in settings.pyDjango 静态文件和 settings.py 中的文件路径
【发布时间】:2012-06-10 15:48:01
【问题描述】:

我正在尝试我的第一个合适的 webdev 项目,并且正在学习 django 框架。

我来这里是为了询问使用“静态文件”的最简洁方式,比如我在我的一个 html 模板中提到的外部 CSS。我尝试阅读official documentation on the subject,但作为初学者发现它有点令人困惑,然后我尝试谷歌搜索,但我注意到大多数指南或stackoverflow答案略有不同,我意识到我需要更好的理解。有点厚颜无耻,但是,有人可以向我解释和总结一下这个过程吗?

作为参考,这是我的项目文件夹层次结构。目前我正在尝试获取模板base.html 以使用CSS/base.css 的样式表:

还有一件事让我感到厌烦,那就是绝对文件路径的使用。到目前为止,我已经设法摆脱了仅使用相对文件路径的情况,这对我来说更有意义,因为目标是在 django 测试服务器上进行开发,然后当我拥有一个时将其全部转移到我自己的服务器上。 (注意:也许是因为我不知道传输过程有多复杂,所以我不明白为什么首选绝对文件路径)。使用相对文件路径有什么问题?

我意识到这已经变成了两个问题,这是违反规则的,但我真的认为这两个问题可以一起回答,如果我理解了一个,可能会帮助我理解另一个。任何帮助将不胜感激。

【问题讨论】:

    标签: python css django


    【解决方案1】:

    这是一组来自 settings.py 的代码 sn-ps 我已更改以包含静态文件

    import os
    import django
    DJANGO_ROOT = os.path.dirname(os.path.realpath(django.__file__))
    SITE_ROOT = os.path.dirname(os.path.realpath(__file__))
    

    为 SITE_ROOT 目录动态设置变量

        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.sqlite3', 
                'NAME': os.path.join(SITE_ROOT,'data.db'),                      
    

    sqlite3 数据库的存储位置需要绝对地址

                'USER': '',
                'PASSWORD': '',
                'HOST': '',                     
                'PORT': '',                     
            }
        }
    
    
    STATIC_ROOT = SITE_ROOT
    STATIC_URL = '/static/'
    

    在此处存储静态文件

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

    模板的存储位置

    TEMPLATE_DIRS = (
        os.path.join(SITE_ROOT,'templates'),
    
    )
    

    现在在模板中使用

     {% load static %} --at beginning
    <link href="{% static "css/bootstrap.min.css"%}" rel="stylesheet" media="screen">
    

    这是一个示例,展示了如何访问静态目录中的“css/bootstrap.min.css

    【讨论】:

      【解决方案2】:

      我将假设您使用的是 Django 1.3 或更高版本,因为它允许您将 staticfiles (docs) 用于静态文件。这是基本思想:每个 Django 网站由多个应用程序(目录)组成,其中包含网站特定部分所需的所有文件(即,models.pyviews.pytemplates 目录以及@987654327 @ 目录)。这个static 目录包含 JavaScript 和 CSS 文件(以及该应用的其他静态文件。

      在部署网站时,运行collectstatic 命令将所有静态文件收集到一个目录中。然后,您可以从该目录将静态文件提供给您网站的访问者(即 Apache 或其他 Web 服务器可以为您执行此操作)。

      所以您的网络项目的一般结构可能是:

      • manage.py
      • 网站/models.py
      • 网站/views.py
      • website/static/website/css/base.css
      • website/static/website/js/base.js
      • 网站/模板/网站/base.html
      • 静态
      • settings.py
      • urls.py

      您会注意到 Django 应用程序的名称在 statictemplates 目录的子目录中重复出现。这是必要的,因为当它们被移动到一般的static 目录时,它将文件分开。在上面的例子中,STATIC_ROOT 是顶级的static 目录,你所有的静态文件都会被复制到这个目录中。

      绝对值得阅读staticfiles 的文档,因为此项目布局允许您轻松地在其他项目中重用 Django 应用程序。例如,您可以想象一个如下所示的网站:

      • blog/models.py
      • blog/templates/blog/overview.html
      • blog/templates/blog/post.html
      • blog/urls.py
      • blog/views.py
      • 照片/models.py
      • 照片/模板/照片/overview.html
      • 照片/模板/照片/照片.html
      • 照片/urls.py
      • 照片/views.py
      • manage.py
      • 静态
      • settings.py
      • urls.py

      如果需要,应用程序 blogphotos 现在可以轻松地在其他网站中重复使用。

      【讨论】:

      • 非常感谢您提供的所有信息,我将其标记为正确,因为您在保持代码模块化以及更多解释部署过程方面提出了一些非常好的观点。不幸的是,我是个傻瓜,还没有弄清楚如何正确设置我自己的练习项目,但我决定在这里提出一个新的、更具体的问题:stackoverflow.com/questions/11033571/…
      • 这如何与工头命令一起工作?在我开始尝试使用工头之前,我的一切工作正常 - 它不会在本地加载任何静态资产......但在部署时工作得很好......来自西蒙的这个答案是我见过的最清楚的解释处理静态文件的过程 - 但我希望在使用工头与实时实例时更加清晰......现在我的管理员在查看工头时没有 css......有什么想法吗?
      【解决方案3】:

      真的很感谢@Simeon Visser 的回答所花费的时间,那里有一些非常有用的信息,但这并不完全是我想要的。所以我四处打听,并请 reddit 的 sinister_user_name 对此表示感谢,我认为这可能对其他人有所帮助:


      静态文件在最近的版本中发生了相当大的变化,所以旧博客可能有点乱。

      我会试一试:

      在您的模板中,您可以使用static_url 标签,django 会为您填写路径。

      <link rel="stylesheet" href="{{ STATIC_URL }}css/bootstrap.min.css">
      

      它通过查看您的设置文件来填充静态 url。 STATIC_URL 默认为 /static/ 我认为在设置中?如果静态文件在您的公司网络服务器上以一个奇怪的 url 结束,您无论如何都可以在设置中更改它,它将反映在所有模板中。所以它们是否是绝对的并不重要。

      当您进行部署时,您在设置中填写STATIC_ROOT,这只是您设置网络服务器以查找静态文件的路径。然后,如果您运行manage.py collectstatic,它会将它们复制到该目录。我认为这是STATIC_ROOT的唯一功能。

      我将模板目录与我的静态目录分开,主要是因为您希望您的网络服务器只提供静态文件,而模板由 python 处理。因此,就 Web 服务器查看静态文件而言,它们几乎不是应用程序的一部分。我将模板和静态文件保存在单独的路径中,只是在基本目录中,主要是因为它们都不是 python 源文件。

      所以我的项目结构是这样的:

      manage.py
      website/settings.py
      app/models.py
      app/views.py
      templates/base.html
      static/js/jquery.js
      static/css/bootstrap.css
      

      相对路径的问题在于,如果您的 url 方案发生变化,它们将需要更改。

      可选:我在此博客中发现,这有助于不将绝对文件系统路径放入 settings.py,如果您在多台机器上工作,例如工作和家庭,这很好:( 由于 1.4 的布局略有不同,我在设置的顶部使用了它:

      import os
      import django
      import manage
      
      DJANGO_ROOT = os.path.dirname(os.path.realpath(django.__file__))
      SITE_ROOT = os.path.dirname(os.path.realpath(manage.__file__))
      

      而不是他们建议的(设置的位置已在 1.4 或 1.3 中移动)所以SITE_ROOT 搞砸了。我认为这可能会奏效。 在我使用的设置中进一步向下:

      # Additional locations of static files
      STATICFILES_DIRS = (
          os.path.join(SITE_ROOT, 'static'),
      )
      

      这将告诉开发服务器在哪里可以找到静态文件。您可以对模板执行相同的操作,也可以只使用完整的文件路径。

      【讨论】:

      • 您的信息也是正确的,尽管您的设置不那么模块化。理想情况下,所有静态文件和模板文件都应位于应用程序内的目录中(只有少数例外,例如 404.html 和 500.html 需要位于根模板目录中)。在本地开发时,STATIC_ROOT 目录应该是空的,并且在生产服务器上应该只有文件。
      猜你喜欢
      • 1970-01-01
      • 2018-02-04
      • 2023-03-03
      • 2014-05-26
      • 1970-01-01
      • 1970-01-01
      • 2012-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多