介绍Python的Django框架中的静态资源管理器django-pipeline


Posted in Python onApril 25, 2015

 django-pipeline 是一个 Django 下非常方便的静态资源管理 app,尤其是 1.2 版本之后,利用 django-staticfiles 的collectstatic 命令,在开发、部署环境下切换非常方便。

写 codinn.com 代码的时候,静态资源管理方面遇到了一些烦人的事情:

  •     为了加速页面加载速度,浏览器会缓存静态文件,静态资源更新后,浏览器很可能从缓存提取过期的静态文件
  •     自己写的 CSS/JS 要手工 minify,非常麻烦
  •     零碎的 CSS/JS 小文件太多
  •     CSS/JS minified 之后,开发环境下调试起来很不方便

django-pipeline 通过静态资源版本化、自动 minify、分组合并 CSS/JS 文件、兼容 django-staticfiles URL 规则以及collectstatic 命令。
slimit / jsmin

图个省心,我通常使用 jsmin/cssmin 这两个 Python minifier:

   

PIPELINE_JS_COMPRESSOR = 'pipeline.compressors.jsmin.JSMinCompressor'
  PIPELINE_CSS_COMPRESSOR = 'pipeline.compressors.cssmin.CssminCompressor'

但是 jsmin 年久失修,实际使用结论是:jsmin 是有 bug 的,jQuery 开发库用 jsmin minify 后被破坏,压根无法正常工作。但是 jQuery 官方 minify 之后的 JS 文件再用 jsmin minify 之后却没有问题。

虽然有规避方案,但始终对 jsmin 不放心,索性改用 slimit,暂时还没发现 JS 被破坏的问题。

django-pipeline 未提供对 slimit 的支持,不过 pipeline 的扩展性还不错,写一个 slimit 扩展也是分钟的事情:

  

from __future__ import absolute_import

  from pipeline.compilers import CompilerBase

  class SlimItCompiler(CompilerBase):
    """
   JS compressor based on the Python library slimit
   (http://pypi.python.org/pypi/slimit/).
   """
    def compress_js(self, js):
      from slimit import minify
      return minify(js)

将以上代码保存成 slimit 文件,扔在项目中的某个包目录下即可,再修改 settings:

   

PIPELINE_JS_COMPRESSOR = 'lib.slimit.SlimItCompiler'

UnicodeDecodeError: 'ascii' codec can't decode byte 问题

启用 django-pipeline 后,执行 manage.py collectstatic 如果碰到下面的错误提示:

     

File ".../ENV/local/lib/python2.7/site-packages/django/contrib/staticfiles/storage.py", line 226, in post_process
    content = pattern.sub(converter, content)
  UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 0: ordinal not in range(128)

八成是因为 CSS 文件中含有中文或其它非拉丁文字。我在使用 @font-face 图标文字时碰到了这个问题,这是 django staticfiles 包的一个 bug,解决方法是修改 /django/contrib/staticfiles/storage.py 文件,把出错的那行代码:

   

content = original_file.read()

替换成:

  

content = original_file.read().decode('utf-8')

用这个方法的前提是:你的 CSS 文件必须保证 utf-8 编码,否则依然会出错。

PS,给 Django 项目提交了一个 bug 报告:https://code.djangoproject.com/ticket/18430

Python 相关文章推荐
日常整理python执行系统命令的常见方法(全)
Oct 22 Python
python实现class对象转换成json/字典的方法
Mar 11 Python
Windows下Python使用Pandas模块操作Excel文件的教程
May 31 Python
Python中创建字典的几种方法总结(推荐)
Apr 27 Python
Python基于list的append和pop方法实现堆栈与队列功能示例
Jul 24 Python
python绘制铅球的运行轨迹代码分享
Nov 14 Python
浅谈python中np.array的shape( ,)与( ,1)的区别
Jun 04 Python
Python获取时间范围内日期列表和周列表的函数
Aug 05 Python
Java文件与类动手动脑实例详解
Nov 10 Python
python实现智能语音天气预报
Dec 02 Python
tensorflow 动态获取 BatchSzie 的大小实例
Jun 30 Python
Python xlwings插入Excel图片的实现方法
Feb 26 Python
在IIS服务器上以CGI方式运行Python脚本的教程
Apr 25 #Python
研究Python的ORM框架中的SQLAlchemy库的映射关系
Apr 25 #Python
Python的ORM框架中SQLAlchemy库的查询操作的教程
Apr 25 #Python
Python实现单词拼写检查
Apr 25 #Python
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
Apr 25 #Python
使用PDB简单调试Python程序简明指南
Apr 25 #Python
Python脚本判断 Linux 是否运行在虚拟机上
Apr 25 #Python
You might like
php 实现进制转换(二进制、八进制、十六进制)互相转换实现代码
2010/10/22 PHP
PHP转盘抽奖接口实例
2015/02/09 PHP
alixixi runcode.asp的代码不错的应用
2007/08/08 Javascript
在Javascript里访问SharePoint列表数据的实现方法
2011/05/22 Javascript
JavaScript实现网站访问次数统计代码
2015/08/12 Javascript
jQuery Select下拉框操作小结(推荐)
2016/07/22 Javascript
微信小程序 action-sheet底部菜单详解
2016/10/27 Javascript
微信小程序 form组件详解及简单实例
2017/01/10 Javascript
react.js 获取真实的DOM节点实例(必看)
2017/04/17 Javascript
浅谈关于.vue文件中style的scoped属性
2017/08/19 Javascript
Vue.js进行查询操作的实例详解
2017/08/25 Javascript
结合mint-ui移动端下拉加载实践方法总结
2017/11/08 Javascript
axios全局注册,设置token,以及全局设置url请求网段的方法
2018/09/25 Javascript
浅谈Vue的响应式原理
2019/05/30 Javascript
vue实现将一个数组内的相同数据进行合并
2019/11/07 Javascript
JS关闭子窗口并且刷新上一个窗口的实现示例
2020/03/10 Javascript
JavaScript 引用类型实例详解【数组、对象、严格模式等】
2020/05/13 Javascript
vue 动态设置img的src地址无效,npm run build 后找不到文件的解决
2020/07/26 Javascript
[49:27]LGD vs OG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[08:06]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant 选手采访
2021/03/11 DOTA
python编程-将Python程序转化为可执行程序[整理]
2007/04/09 Python
python开启多个子进程并行运行的方法
2015/04/18 Python
python在不同层级目录import模块的方法
2016/01/31 Python
python requests.post带head和body的实例
2019/01/02 Python
Python分布式进程中你会遇到的问题解析
2019/05/28 Python
Python实现Restful API的例子
2019/08/31 Python
Pyspark读取parquet数据过程解析
2020/03/27 Python
全网最全python库selenium自动化使用详细教程
2021/01/12 Python
使用canvas一步步实现图片打码功能的方法
2019/06/17 HTML / CSS
美国著名的女性内衣零售商:Frederick’s of Hollywood
2018/02/24 全球购物
Under Armour安德玛法国官网:美国高端运动科技品牌
2018/06/29 全球购物
艺术家策划的室内设计:Curious Egg
2019/03/06 全球购物
学校春季防火方案
2014/06/08 职场文书
廉洁自律承诺书2015
2015/01/22 职场文书
银行文明优质服务培训心得体会
2016/01/09 职场文书
JavaScript原型链详解
2021/11/07 Javascript