我正在尝试我的第一个正确的webdev项目,我正在学习django框架。
我来这里询问使用“静态文件”的最简洁方法,就像我在我的一个html模板中引用的外部CSS一样。我尝试阅读official documentation on the subject,但发现它有点令人困惑作为初学者,然后我尝试谷歌搜索但我注意到大多数指南或stackoverflow答案略有不同,我意识到我需要更好的理解。请问有点厚颜无耻,但有人可以向我解释并总结这个过程吗?
供参考,这是我的项目文件夹层次结构。目前我正在尝试让模板base.html
使用CSS/base.css
处的sylesheet:
还有一个让我失望的事情就是使用绝对文件路径。到目前为止,我已经成功地使用了相对文件路径,这对我来说更有意义,因为我的目标是在django测试服务器上进行开发,然后将其全部传输到我自己的服务器上。 (注意:也许是因为我不知道传输过程有多复杂,我不明白为什么绝对文件路径是首选的)。使用相对文件路径有什么问题?
我意识到这有两个问题,这是违反规则的,但我真的认为两者都可以一起回答,如果我理解了一个,那么它可能有助于我理解另一个。任何帮助将不胜感激。
答案 0 :(得分:4)
以下是来自 settings.py 的一组代码段我已更改为包含静态文件 drchrono项目的Django设置。
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 ”的示例
答案 1 :(得分:2)
我假设您正在使用Django 1.3或更高版本,因为它允许您使用staticfiles
(docs)来表示静态文件。这是基本的想法:每个Django网站都包含多个应用程序(目录),其中包含网站特定部分所需的所有文件(即models.py
,views.py
,templates
目录和static
目录)。此static
目录包含JavaScript和CSS文件(以及该应用程序的其他静态文件。
部署网站时,运行collectstatic
命令将所有静态文件收集到一个目录中。然后从该目录中将静态文件提供给您站点的访问者(即,Apache或其他Web服务器可以为您执行此操作)。
因此,您的Web项目的一般结构可能是:
您会注意到Django应用程序的名称在static
和templates
目录的子目录中重复出现。这是必要的,因为它在将文件移动到通用static
目录时保持文件分开。在上面的示例中,STATIC_ROOT
是顶级static
目录,并且在此目录中将复制所有静态文件。
绝对值得阅读staticfiles
的文档,因为这个项目布局允许您轻松地在其他项目中重用Django应用程序。例如,您可以想象一个如下所示的网站:
如果需要,应用blog
和photos
现在可以轻松地在其他网站中重复使用。
答案 2 :(得分:1)
非常感谢@Simeon Visser回答的时间,那里有一些非常有用的信息,但并不完全是我想要的。所以我四处询问并从reddit获得sinister_user_name以感谢这一点,我认为这可能对其他人有所帮助:
静态文件在最近的版本中发生了相当大的变化,因此旧的博客可能有点混乱。
我会试一试:
在您的模板中,您可以使用static_url
标记,django将为您填写路径。
<link rel="stylesheet" href="{{ STATIC_URL }}css/bootstrap.min.css">
通过查看您的设置文件来填充静态网址。 STATIC_URL
默认为/static/
我认为在设置中?如果静态文件最终出现在公司Web服务器上的一个奇怪的URL中,那么无论如何都可以在设置中更改它,它将反映在所有模板中。所以它们是绝对的并不重要。
当您去部署时,在您的设置中填写STATIC_ROOT
,这只是您设置网络服务器以查找静态文件的路径。然后,如果您运行manage.py collectstatic
,它会将它们复制到该目录。这是我认为STATIC_ROOT
的唯一功能。
我将模板目录与静态目录分开,主要是因为您希望Web服务器只提供静态文件,而模板由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
相对路径的问题是,如果您的网址方案发生变化,他们将需要更改。
可选:我发现在这个博客中有助于不将绝对文件系统路径放入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'),
)
这将告诉开发服务器在哪里找到静态文件。您可以对模板执行相同操作,也可以只使用完整文件路径。