介绍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时间的精准正则匹配方法分析
Aug 17 Python
python ddt实现数据驱动
Mar 14 Python
pytorch + visdom 处理简单分类问题的示例
Jun 04 Python
使用python3构建文件传输的方法
Feb 13 Python
TensorFlow绘制loss/accuracy曲线的实例
Jan 21 Python
在keras中获取某一层上的feature map实例
Jan 24 Python
详解Python的三种拷贝方式
Feb 11 Python
pycharm如何实现跨目录调用文件
Feb 28 Python
python实现飞机大战项目
Mar 11 Python
python 利用jieba.analyse进行 关键词提取
Dec 17 Python
python线程优先级队列知识点总结
Feb 28 Python
pytorch交叉熵损失函数的weight参数的使用
May 24 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 setcookie(name, value, expires, path, domain, secure) 参数详解
2013/06/28 PHP
PHP中鲜为人知的10个函数
2014/02/28 PHP
php 购物车完整实现代码
2014/06/05 PHP
浅谈php安全性需要注意的几点事项
2014/07/17 PHP
ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼
2015/03/25 PHP
php实现通过stomp协议连接ActiveMQ操作示例
2020/02/23 PHP
jQuery中DOM树操作之复制元素的方法
2015/01/23 Javascript
基于jQuery Bar Indicator 插件实现进度条展示效果
2015/09/30 Javascript
原生javascript实现自动更新的时间日期
2016/02/12 Javascript
jquery dataview数据视图插件使用方法
2016/12/23 Javascript
jsonp跨域请求实现示例
2017/03/13 Javascript
想用好React的你必须要知道的一些事情
2017/07/24 Javascript
使用jQuery实现页面定时弹出广告效果
2017/08/24 jQuery
webpack打包js的方法
2018/03/12 Javascript
JavaScript根据json生成html表格的示例代码
2018/10/24 Javascript
vue-cli 2.*中导入公共less文件的方法步骤
2018/11/22 Javascript
JavaScript实现邮箱后缀提示功能的示例代码
2018/12/13 Javascript
Layer.js实现表格溢出内容省略号显示,悬停显示全部的方法
2019/09/16 Javascript
微信小程序实现录音功能
2019/11/22 Javascript
微信小程序中使用 async/await的方法实例分析
2020/05/06 Javascript
vue渲染方式render和template的区别
2020/06/05 Javascript
如何在vue-cli中使用css-loader实现css module
2021/01/07 Vue.js
基于scrapy实现的简单蜘蛛采集程序
2015/04/17 Python
Django框架模板注入操作示例【变量传递到模板】
2018/12/19 Python
Python实现二叉树的常见遍历操作总结【7种方法】
2019/03/06 Python
opencv python 图片读取与显示图片窗口未响应问题的解决
2020/04/24 Python
python如何安装下载后的模块
2020/07/03 Python
美国网上花店:JustFlowers
2017/02/12 全球购物
介绍一下SQL注入攻击的种类和防范手段
2012/02/18 面试题
kfc实习自我鉴定
2013/12/14 职场文书
总经理司机职责
2014/02/02 职场文书
计算机毕业生求职信
2014/06/10 职场文书
领导干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2015年元旦联欢晚会活动总结
2014/11/28 职场文书
2015年大学社团工作总结
2015/04/09 职场文书
2015年小学英语教师工作总结
2015/05/12 职场文书