Django 1.3 增加的新功能 django.contrib.staticfiles。以应对多应用,多组静态文件的情况。
django.contrib.staticfiles 收集你每个应用(和任何指定的其它地方)的静态文件(static files)到单个的位置,使其利于在生产环境使用。
注意:django.contrib.staticfiles来自于以前的第三方应用django-staticfiles,他们是非常相似的。
使用 django.contrib.staticfiles
基本用法
1.放你的静态文件到某处,staticfiles将寻找它们。
默认在你的setting INSTALLED_APPS中安装的每个django应用里的static/ 子目录中。
你的项目可能也有一些静态资源不是和特定的应用相关。STATICFILES_DIRS 可以设定一组在装入静态文件时要搜索的目录。默认搜
索路径为空。看STATICFILES_DIRS 文档怎样追加一个路径列表。
此外,看 STATICFILES_FINDERS 设定的文档了解staticfiles 寻找你文件的细节。
2.确信django.contrib.staticfiles是包括在你的 INSTALLED_APPS中。
对于本地部署,如果你使用了Django自带的runserver 或者追加 staticfiles_urlpatterns 在你的URL配置文件,你的静态文件将自动的
服务在默认的 STATIC_URL ,即 /static/ 。
3.你可能在你的模板中要引用这些静态文件。最简单的方法是使用包括上下文处理器。像下面的代码:
<img src="{{ STATIC_URL }}images/hi.jpg" />
看 Referring to static files in templates 为更多的细节。
部署静态文件的简单步骤
当你准备把你的项目从本地移走而且在其他地方部署时:
1.在setting中用 STATIC_URL 设定你的静态文件发布URL(在大多数情况,默认值/static/就很好)。
2.在setting中用 STATIC_ROOT 设定你用 collectstatic 命令收集的静态文件路径。例如:
STATIC_ROOT = "/home/jacob/projects/mysite.com/sitestatic"
3.运转 collectstatic 管理命令。
./manage.py collectstatic
这将汇合你的静态文件而且拷贝它们到 STATIC_ROOT 指定的路径。
4.部署这些文件在你的webserver上,配置你的webserver作用这些文件于STATIC_ROOT at STATIC_URL。
Serving static files in production 会叙述一些静态文件的常用部署策略。
这些是基本的。为更多的公共配置选项,请继续读settings, commands的详细参考,还有小部分包括自框架中,看 the staticfiles reference。
伺服静态文件在生产环境
总的来说在生产环境布置静态文件是简单的:当静态文件改变时运行collectstatic 命令,将收集到的静态文件的静态文件路径 (STATIC_ROOT)移动到静态文件服务器而且开始服务。
当然,如同所有的部署工作,痛苦在细节。每个生产环境的设置将会有点不同,因此你需要改动基本设置以适应你的需要。下面是一些公共的模式可以帮到你。
如果你想服务静态文件和你的网站在同一个服务器上,基本的修正看上去像下面这样:
.放置你的代码到部署服务器
.在服务器上,运转collectstatic拷贝所有的静态文件到 STATIC_ROOT 。
.让你的 web server 指向STATIC_ROOT 。例如,这儿 how to do this under Apache and mod_wsgi.
有数个方法可以自动完成这个过程,单大多数django设计者是感兴趣 Fabric.
接下来我们将秀一些 fabfiles(Fabric的脚本)的例子,自动部署这些文件,一个fabfile的语法是相当直白的,可以翻阅 Fabric's documentation 了解完整的语法。
一个fabfile文件部署静态文件到一组 web server 应当看上去如下:
from fabric.api import * # Hosts to deploy onto env.hosts = ['www1.example.com', 'www2.example.com'] # Where your project code lives on the server env.project_root = '/home/www/myproject' def deploy_static(): with cd(env.project_root): run('./manage.py collectstatic -v0 --noinput')
评论