介绍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实现字符串逆序输出功能示例
Jun 24 Python
Python基于回溯法子集树模板解决找零问题示例
Sep 11 Python
基于python3 类的属性、方法、封装、继承实例讲解
Sep 19 Python
Python 实现12306登录功能实例代码
Feb 09 Python
Python学习小技巧总结
Jun 10 Python
python 实现12bit灰度图像映射到8bit显示的方法
Jul 08 Python
Django REST framework内置路由用法
Jul 26 Python
python 普通克里金(Kriging)法的实现
Dec 19 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
Feb 11 Python
python rolling regression. 使用 Python 实现滚动回归操作
Jun 08 Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
Oct 09 Python
Python如何批量生成和调用变量
Nov 21 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 switch语句多个值匹配同一代码块的实现
2014/03/03 PHP
php缩放gif和png图透明背景变成黑色的解决方法
2014/10/14 PHP
php面向对象的用户登录身份验证
2017/06/08 PHP
详解php几行代码实现CSV格式文件输出
2017/07/01 PHP
PHP Include文件实例讲解
2019/02/15 PHP
jQuery实现跨域iframe接口方法调用
2015/03/14 Javascript
JavaScript把数组作为堆栈使用的方法
2015/03/20 Javascript
JavaScript操作class和style样式代码详解
2016/02/13 Javascript
AngularJS包括详解及示例代码
2016/08/17 Javascript
微信小程序 设置启动页面的两种方法
2017/03/09 Javascript
详解AngularJS ng-class样式切换
2017/06/27 Javascript
使用原生js封装的ajax实例(兼容jsonp)
2017/10/12 Javascript
Element-UI Table组件上添加列拖拽效果实现方法
2018/04/14 Javascript
浅谈JS对象添加getter与setter的5种方法
2018/06/09 Javascript
JavaScript数组去重的方法总结【12种方法,号称史上最全】
2019/02/28 Javascript
使用ESLint禁止项目导入特定模块的方法步骤
2019/03/04 Javascript
详解JavaScript 新语法之Class 的私有属性与私有方法
2019/04/23 Javascript
vue项目中将element-ui table表格写成组件的实现代码
2019/06/12 Javascript
关于vue里页面的缓存详解
2019/11/04 Javascript
Angular封装表单控件及思想总结
2019/12/11 Javascript
[00:32]2018DOTA2亚洲邀请赛Liquid出场
2018/04/03 DOTA
Python通过websocket与js客户端通信示例分析
2014/06/25 Python
python多重继承新算法C3介绍
2014/09/28 Python
python实现TF-IDF算法解析
2018/01/02 Python
Python读取MRI并显示为灰度图像实例代码
2018/01/03 Python
python scipy卷积运算的实现方法
2019/09/16 Python
Python读取分割压缩TXT文本文件实例
2020/02/14 Python
Python如何用filter函数筛选数据
2020/03/05 Python
CSS3弹性伸缩布局之box布局
2016/07/12 HTML / CSS
英国在线汽车和面包车零件商店:Car Parts 4 Less
2018/08/15 全球购物
网站开发实习生的自我评价
2013/12/11 职场文书
致标枪运动员广播稿
2014/02/06 职场文书
考生诚信考试承诺书
2014/05/23 职场文书
小学安全汇报材料
2014/08/14 职场文书
企业员工爱岗敬业演讲稿
2014/08/26 职场文书
学校安全管理制度
2015/08/06 职场文书