介绍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系列之数据处理编程实例(二)
May 22 Python
windows系统下Python环境的搭建(Aptana Studio)
Mar 06 Python
python+opencv实现动态物体识别
Jan 09 Python
python实现手机通讯录搜索功能
Feb 22 Python
python unittest实现api自动化测试
Apr 04 Python
python实现log日志的示例代码
Apr 28 Python
一行代码让 Python 的运行速度提高100倍
Oct 08 Python
python操作cfg配置文件方式
Dec 22 Python
Pytorch Tensor 输出为txt和mat格式方式
Jan 03 Python
keras 模型参数,模型保存,中间结果输出操作
Jul 06 Python
python利用faker库批量生成测试数据
Oct 15 Python
python pygame 开发五子棋双人对弈
May 02 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
Yii清理缓存的方法
2016/01/06 PHP
js 鼠标拖动对象 可让任何div实现拖动效果
2009/11/09 Javascript
javascript 触发HTML元素绑定的函数
2010/09/11 Javascript
ASP.NET jQuery 实例1(在TextBox里面创建一个默认提示)
2012/01/13 Javascript
尝试在让script的type属性等于text/html
2013/01/15 Javascript
THREE.JS入门教程(4)创建粒子系统
2013/01/24 Javascript
JavaScript实现网页截图功能
2014/10/16 Javascript
跟我学习javascript的undefined与null
2015/11/17 Javascript
Vue.js每天必学之组件与组件间的通信
2016/09/08 Javascript
聊一聊JS中的prototype
2016/09/29 Javascript
jquery将标签元素的高设为屏幕的百分比
2017/04/19 jQuery
打字效果动画的4种实现方法(超简单)
2017/10/18 Javascript
使用electron将vue-cli项目打包成exe的方法
2018/09/29 Javascript
js尾调用优化的实现
2019/05/23 Javascript
Nautil 中使用双向数据绑定的实现
2019/10/02 Javascript
JavaScript实现简单的计算器
2020/01/16 Javascript
Python2/3中urllib库的一些常见用法
2017/12/19 Python
Python实现备份MySQL数据库的方法示例
2018/01/11 Python
python opencv实现任意角度的透视变换实例代码
2018/01/12 Python
python 用正则表达式筛选文本信息的实例
2018/06/05 Python
详解python3中zipfile模块用法
2018/06/18 Python
Python在for循环中更改list值的方法【推荐】
2018/08/17 Python
Python编程中flask的简介与简单使用
2018/12/28 Python
python实现对象列表根据某个属性排序的方法详解
2019/06/11 Python
python mqtt 客户端的实现代码实例
2019/09/25 Python
将python2.7添加进64位系统的注册表方式
2019/11/20 Python
html5中canvas图表实现柱状图的示例
2017/11/13 HTML / CSS
英国鲜花速递:Serenata Flowers
2018/04/03 全球购物
俄罗斯三星品牌商店:GalaxyStore
2020/11/04 全球购物
如何用Lucene索引数据库
2016/02/23 面试题
21岁生日感言
2014/02/27 职场文书
2019运动会广播加油稿汇总
2019/08/21 职场文书
React 高阶组件HOC用法归纳
2021/06/13 Javascript
golang 实用库gotable的具体使用
2021/07/01 Golang
Java数据开发辅助工具Docker与普通程序使用方法
2021/09/15 Java/Android
SQL SERVER中的流程控制语句
2022/05/25 SQL Server