介绍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 相关文章推荐
50行代码实现贪吃蛇(具体思路及代码)
Apr 27 Python
python字符串连接方式汇总
Aug 21 Python
Python中的列表生成式与生成器学习教程
Mar 13 Python
Python中工作日类库Busines Holiday的介绍与使用
Jul 06 Python
Python实现批量读取图片并存入mongodb数据库的方法示例
Apr 02 Python
Django框架多表查询实例分析
Jul 04 Python
django之跨表查询及添加记录的示例代码
Oct 16 Python
pytorch GAN伪造手写体mnist数据集方式
Jan 10 Python
python json 递归打印所有json子节点信息的例子
Feb 27 Python
基于python实现获取网页图片过程解析
May 11 Python
详解torch.Tensor的4种乘法
Sep 03 Python
Python编解码问题及文本文件处理方法详解
Jun 20 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中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
2010/08/21 PHP
PHP基于正则批量替换Img中src内容实现获取缩略图的功能示例
2017/06/07 PHP
PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
2017/07/03 PHP
基于Jquery的温度计动画效果
2010/06/18 Javascript
jQuery powerFloat万能浮动层下拉层插件使用介绍
2010/12/27 Javascript
jquery 笔记 事件
2011/11/02 Javascript
jQuery操作input type=radio的实现代码
2012/06/14 Javascript
ScrollDown的基本操作示例
2013/06/09 Javascript
jquery图片不完全按比例自动缩小的简单代码
2013/07/29 Javascript
jquery放大镜效果超漂亮噢
2013/11/15 Javascript
浅谈javascript基础之客户端事件驱动
2016/06/10 Javascript
js选择器全面解析
2016/06/27 Javascript
详解JS几种变量交换方式以及性能分析对比
2016/11/25 Javascript
template.js前端模板引擎使用详解
2017/10/10 Javascript
Koa代理Http请求的示例代码
2018/10/10 Javascript
详解vue如何使用rules对表单字段进行校验
2018/10/17 Javascript
详解Vue.js在页面加载时执行某个方法
2018/11/20 Javascript
jQuery 添加元素和删除元素的方法
2020/07/15 jQuery
浅谈vue websocket nodeJS 进行实时通信踩到的坑
2020/09/22 NodeJs
Vue使用Proxy代理后仍无法生效的解决
2020/11/13 Javascript
详解Python的Django框架中的通用视图
2015/05/04 Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
2017/08/21 Python
VSCode下好用的Python插件及配置
2018/04/06 Python
更新升级python和pip版本后不生效的问题解决
2020/04/17 Python
pycharm 添加解释器的方法步骤
2020/08/31 Python
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
2014/05/08 HTML / CSS
eDreams加拿大:廉价航班、酒店和度假
2019/03/29 全球购物
办理暂住证介绍信
2014/01/11 职场文书
环保倡议书400字
2014/05/15 职场文书
关于保护环境的建议书
2014/08/26 职场文书
作风建设年活动总结
2014/08/27 职场文书
2014新生大学四年计划书
2014/09/21 职场文书
监察建议书
2015/02/04 职场文书
HTML中的表单元素介绍
2022/02/28 HTML / CSS
mysql 获取相邻数据项
2022/05/11 MySQL
使用compose函数优化代码提高可读性及扩展性
2022/06/16 Javascript