介绍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使用点操作符访问字典(dict)数据的方法
Mar 16 Python
Python下载指定页面上图片的方法
May 12 Python
Python while 循环使用的简单实例
Jun 08 Python
Python 快速实现CLI 应用程序的脚手架
Dec 05 Python
tensorflow实现对图片的读取的示例代码
Feb 12 Python
python实现图书馆研习室自动预约功能
Apr 27 Python
Python Numpy 实现交换两行和两列的方法
Jun 26 Python
python解释器spython使用及原理解析
Aug 24 Python
8段用于数据清洗Python代码(小结)
Oct 31 Python
通过实例了解Python str()和repr()的区别
Jan 17 Python
jupyter notebook tensorflow打印device信息实例
Apr 20 Python
python爬取微博评论的实例讲解
Jan 15 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 时间计算问题小结
2009/01/04 PHP
php数组中包含中文的排序方法
2014/06/03 PHP
php的debug相关函数用法示例
2016/07/11 PHP
Jquery弹出窗口插件 LeanModal的使用方法
2012/03/10 Javascript
JQuery入门——用bind方法绑定事件处理函数应用介绍
2013/02/05 Javascript
关于jQuery $.isNumeric vs. $.isNaN vs. isNaN
2013/04/15 Javascript
node.js中的fs.readFile方法使用说明
2014/12/15 Javascript
微信中一些常用的js方法汇总
2015/03/12 Javascript
js弹出窗口返回值的简单实例
2016/05/28 Javascript
JavaScript中setter和getter方法介绍
2016/07/11 Javascript
JavaScript面试题大全(推荐)
2016/09/22 Javascript
nodejs和php实现图片访问实时处理
2017/01/05 NodeJs
js仿拉勾网首页穿墙广告效果
2017/03/08 Javascript
jquery实现图片轮播器
2017/05/23 jQuery
javascript用rem来做响应式开发
2018/01/13 Javascript
vue项目打包后怎样优雅的解决跨域
2019/05/26 Javascript
js使用文档就绪函数动态改变页面内容示例【innerHTML、innerText】
2019/11/07 Javascript
JavaScript多种滤镜算法实现代码实例
2019/12/10 Javascript
小程序实现列表展开收起效果
2020/07/29 Javascript
[02:09]DOTA2辉夜杯 EHOME夺冠举杯现场
2015/12/28 DOTA
[01:00:10]完美世界DOTA2联赛PWL S2 FTD vs Inki 第二场 11.21
2020/11/24 DOTA
[54:57]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第二场 1月8日
2021/03/11 DOTA
Python模拟登录验证码(代码简单)
2016/02/06 Python
Python调用SQLPlus来操作和解析Oracle数据库的方法
2016/04/09 Python
Python匹配中文的正则表达式
2016/05/11 Python
Python中datetime模块参考手册
2017/01/13 Python
Django中利用filter与simple_tag为前端自定义函数的实现方法
2017/06/15 Python
python的变量与赋值详细分析
2017/11/08 Python
python实现KNN分类算法
2019/10/16 Python
Python写捕鱼达人的游戏实现
2020/03/31 Python
孝敬父母的演讲稿
2014/05/14 职场文书
白酒代理协议书范本
2014/10/26 职场文书
原告离婚代理词
2015/05/23 职场文书
如何撰写出一份完美的商业计划书?
2019/07/12 职场文书
OpenCV中resize函数插值算法的实现过程(五种)
2021/06/05 Python
《废话连篇——致新手》——chinapizza
2022/04/05 无线电