介绍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文件和目录操作方法大全(含实例)
Mar 12 Python
Python StringIO模块实现在内存缓冲区中读写数据
Apr 08 Python
python安装numpy&安装matplotlib& scipy的教程
Nov 02 Python
使用Python设计一个代码统计工具
Apr 04 Python
Python机器学习库scikit-learn安装与基本使用教程
Jun 25 Python
浅谈python中拼接路径os.path.join斜杠的问题
Oct 23 Python
pygame游戏之旅 如何制作游戏障碍
Nov 20 Python
在numpy矩阵中令小于0的元素改为0的实例
Jan 26 Python
PyTorch中Tensor的拼接与拆分的实现
Aug 18 Python
Python优秀开源项目Rich源码解析的流程分析
Jul 06 Python
Python中logging日志记录到文件及自动分割的操作代码
Aug 05 Python
Python中Selenium模块的使用详解
Oct 09 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
桌面中心(四)数据显示
2006/10/09 PHP
无数据库的详细域名查询程序PHP版(2)
2006/10/09 PHP
MySql 按时间段查询数据方法(实例说明)
2008/11/02 PHP
PHP中使用Memache作为进程锁的操作类分享
2015/03/30 PHP
CentOS系统中PHP安装扩展的方式汇总
2017/04/09 PHP
php表单习惯用的正则表达式
2017/10/11 PHP
用javascript来实现动画导航效果的代码
2007/12/16 Javascript
JavaScript入门教程(9) Document文档对象
2009/01/31 Javascript
js实现可拖动DIV的方法
2013/12/17 Javascript
浅谈JavaScript 框架分类
2014/11/10 Javascript
javascript简单实现滑动菜单效果的方法
2015/07/27 Javascript
jQuery插件实现适用于移动端的地址选择器
2016/02/18 Javascript
Bootstrap模块dropdown实现下拉框响应
2016/05/22 Javascript
JS正则替换去空格的方法
2017/03/24 Javascript
详解vue-meta如何让你更优雅的管理头部标签
2018/01/18 Javascript
微信小程序实现弹框效果
2020/05/26 Javascript
JS将指定的某个字符全部转换为其他字符实例代码
2020/10/13 Javascript
python数据结构之二叉树的建立实例
2014/04/29 Python
Python动态加载模块的3种方法
2014/11/22 Python
Python随手笔记第一篇(2)之初识列表和元组
2016/01/23 Python
Python中使用装饰器来优化尾递归的示例
2016/06/18 Python
解决pandas read_csv 读取中文列标题文件报错的问题
2018/06/15 Python
pytorch 预训练层的使用方法
2019/08/20 Python
Python中字典与恒等运算符的用法分析
2019/08/22 Python
python3 selenium自动化测试 强大的CSS定位方法
2019/08/23 Python
numpy的Fancy Indexing和array比较详解
2020/06/11 Python
使用keras实现非线性回归(两种加激活函数的方式)
2020/07/05 Python
PyQt5通过信号实现MVC的示例
2021/02/06 Python
HTML5本地存储之IndexedDB
2017/06/16 HTML / CSS
美国最大的在线寄售和旧货店:Swap.com
2018/08/27 全球购物
销售团队激励口号
2014/06/06 职场文书
2014年商场国庆节活动策划方案
2014/09/16 职场文书
2015年乡镇流动人口工作总结
2015/05/12 职场文书
民间借贷借条范本
2015/05/25 职场文书
幼儿教师继续教育培训心得体会
2016/01/19 职场文书
农村房屋租赁合同(范本)
2019/07/23 职场文书