5

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

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

作为参考,这是我的项目文件夹层次结构。目前我正在尝试让模板base.html在以下位置使用样式表CSS/base.css在此处输入图像描述

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

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

4

3 回答 3

5

这是一组来自settings.py的代码片段,我已更改以包含静态文件

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 ”

于 2013-07-22T04:17:52.443 回答
2

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

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

因此,您的 Web 项目的一般结构可能是:

  • 管理.py
  • 网站/models.py
  • 网站/views.py
  • 网站/静态/网站/css/base.css
  • 网站/静态/网站/js/base.js
  • 网站/模板/网站/base.html
  • 静止的
  • 设置.py
  • 网址.py

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

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

  • 博客/models.py
  • 博客/模板/博客/overview.html
  • 博客/模板/博客/post.html
  • 博客/urls.py
  • 博客/views.py
  • 照片/模型.py
  • 照片/模板/照片/overview.html
  • 照片/模板/照片/photo.html
  • 照片/urls.py
  • 照片/views.py
  • 管理.py
  • 静止的
  • 设置.py
  • 网址.py

blog如果需要,这些应用程序photos现在可以很容易地在其他网站中重复使用。

于 2012-06-10T16:33:12.883 回答
1

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


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

我试一试:

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

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

它通过查看您的设置文件来填充静态 url。STATIC_URL默认设置为/static/我认为的设置?如果静态文件在您的公司 Web 服务器上出现一个奇怪的 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'),
)

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

于 2012-06-11T18:07:13.650 回答