资讯
  • 产品
  • 供应商
  • 求购
  • 生意经
当前位置: 首页 » 资讯 » 行业资讯 » 正文

Django对静态文件的处理——部署阶段

放大字体  缩小字体 更新日期:2015-11-29  作者:商路通   浏览次数:9070
核心提示:静态文件都应该交由专门的服务器来处理。但在开发阶段,本地不一定能模拟生产环境,这时也是要使用静态文件的。为此 Django提供了一些工具来处理静态文件,作为开发阶段的临...

适用于Django低版本 <=1.5

Django 的官方文档中说,Django 主要关注的是 Web App的动态部分,像图片、CSS、JS 等的静态文件都应该交由专门的服务器来处理。

但在开发阶段,本地不一定能模拟生产环境,这时也是要使用静态文件的。为此 Django提供了一些工具来处理静态文件,作为开发阶段的临时解决方案。

所以就分 开发阶段 和 部署阶段 两种情况来说 Django 的静态文件处理。

部署阶段

这个比较简单,因为 Django 将这部分的工作完全抛给服务器(比如 Nginx)了:在 HTML 中指定URL,同时将要用到的静态文件都放在一个地方,然后告诉服务器当对这些 URL 发起请求时到这个地方去寻找。

Django 在这个阶段的工作中只是提供了几个辅助工具。

django.contrib.staticfiles,用来将该 Django项目用到的所有静态文件统一收集到一个单独的文件夹中,这样在服务器配置中指向这个文件夹即可。主要操作如下:

到 settings.py 中设置STATICFILES_DIRS(可以不设置),告诉 staticfiles 去哪儿找静态文件。同时,staticfiles默认都会搜集每个应用目录下的 static/ 文件夹。

到 settings.py 中设置STATIC_ROOT ,告诉 staticfiles 将所有的静态文件收集到哪里。

确保 INSTALLED_APPS中有 django.contrib.staticfiles 这项。

运行如下命令后,所有的静态文件就会被拷贝到 STATIC_ROOT 目录下。


./manage.pycollectstatic

当然了,你完全可以不用管这些,手动将你要用到的静态文件收集到一起,如果你的项目很小的话。staticfiles只是一个可选工具,其本身也是在 1.3 之后才引入 Django 中,它的前身是 Django的第三方工具包 django-staticfiles。

static模板标签,用来生成静态文件的 URL 地址。这样当负责静态文件的服务器发生变动的时候,就不用一个个地改模板了。有以下几种方式:

直接在模板中使用 STATIC_URL 变量,比如

src= {{STATIC_URL}}images/hi.jpg />

当然这个变量不是凭空来的,它是 django.core.context_processors.static 提供的,默认已经在TEMPLATE_CONTEXT_PROCESSORS 中开启了。因为用到了context_processor,所以你需要在渲染模板的时候使用RequestContext ,如果你用的是render_to_response,那么就是:


return render_to_response( some.html ,{},context_instanc=RequestContext(request))

如果嫌 RequestContext麻烦,你可以使用 get_static_prefix 这个内置的模板标签,效果是一样的:


{% load static %}  <</font>imgsrc= {%get_static_prefix %}images/hi.jpg />

你也可以用另外一个内置模板标签static,同样不需要 RequestContext:


{% load static %} src= {%static images/hi.jpg %} />

它实际上调用的是 Python内置模块中的 urlparse.urljoin(),将 STATIC_URL 和 后面的 path拼接到了一起。

还有一个同名但更强大的 static模板标签,存在于之前提到过的 staticfiles 组件中,用法类似:


{% load staticfiles %} src= {%static images/hi.jpg %} />

注意 load 的对象不同。这个static 的强大之处在于,即使你更换了静态文件的存储方式(比如使用了 CDN 或者某种云服务),仍然不用修改模板。你只需要更改STATICFILES_STORAGE 中使用的存储引擎即可,通过修改存储引擎中的对应方法来改变 static 标签的行为。

这几个方法看起来让人眼花缭乱,实际使用中不用纠结这么多,Django官方建议直接使用 staticfiles 中的static,以方便以后的扩展。而前三种方法,大概可以看做历史遗留产物了吧。

这就是 Django 为部署阶段提供的两方面帮助:收集静态文件,生成静态资源的 URL。

下面来总结下上面提到过的 settings.py 中的设置项:

STATIC_ROOT:执行 ./manage.py collectstatic后,所有静态文件就会被收集到这个文件夹下;

STATIC_URL:静态文件的 URL 前缀,供类似static,get_static_prefix 等模板标签使用;

STATICFILES_DIRS:除 每个应用目录下的 static/目录外,其他静态文件可能存放的目录;

STATICFILES_FINDERS:告诉 collectstatic命令都需要去哪儿找静态文件,以及寻找的顺序,有点儿类似 TEMPLATE_LOADERS;

STATICFILES_STORAGE:collectstatic命令所使用的存储引擎,默认情况下不用修改,使用内置的 StaticFilesStorage 即可。如果要使用 CDN或云服务来提供静态资源,可以编写相应的存储引擎并替换即可。

INSTALLED_APPS:要使用上面这些功能,就要在这里开启django.contrib.staticfiles 这个应用;另外,只有在这里出现的应用才会被 collectstatic搜集到。

还有两个相关的设置项:

MEDIA_ROOT:用来存放用户上传文件的目录。

MEDIA_URL:用户上传文件的 URL 前缀。

在之前版本的 Django 中,不区分 MEDIA_ROOT 和 STATIC_ROOT,显然不太合适。分开之后,你可以将MEDIA_ROOT 中的文件像其他静态文件一样,交给专门的服务器处理,或者使用 CDN 和云服务资源。staticfiles这个工具并不干涉 MEDIA_ROOT 中的文件。用户上传文件在 Django 看来属于 Stored Files,区别于Static Files 来看待,这就是另外一个话题了。

 
[ 资讯搜索 ]  [ 加入收藏 ]  [ 告诉好友 ]  [ 打印本文 ]  [ 违规举报 ]  [ 关闭窗口 ]

 
0条 [查看全部]  相关评论

推荐图文
推荐资讯
网站首页 | 关于我们 | 使用协议 | 版权隐私 | 支付方式 | 联系方式 | 网站地图 | 排名推广 | 广告服务 | 积分换礼 | 网站留言 | RSS订阅 | 浙ICP备10021667号