介绍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中的Django框架中prefetch_related()函数对数据库查询的优化
Apr 01 Python
用Python的Django框架来制作一个RSS阅读器
Jul 22 Python
浅谈python中的__init__、__new__和__call__方法
Jul 18 Python
Python文本处理之按行处理大文件的方法
Apr 09 Python
深入浅析python with语句简介
Apr 11 Python
python爱心表白 每天都是浪漫七夕!
Aug 18 Python
用django-allauth实现第三方登录的示例代码
Jun 24 Python
pip指定python位置安装软件包的方法
Jul 12 Python
Python笔记之代理模式
Nov 20 Python
Python PyInstaller安装和使用教程详解
Jan 08 Python
python cv2.resize函数high和width注意事项说明
Jul 05 Python
matplotlib之多边形选区(PolygonSelector)的使用
Feb 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
第二节 对象模型 [2]
2006/10/09 PHP
PHP5中实现多态的两种方法实例分享
2014/04/21 PHP
PHP队列用法实例
2014/11/05 PHP
php实现按照权重随机排序数据的方法
2015/01/09 PHP
纯php生成随机密码
2015/10/30 PHP
PHP QRCODE生成彩色二维码的方法
2016/05/19 PHP
php对接java现实加签验签的实例
2016/11/25 PHP
基于ThinkPHP5框架使用QueryList爬取并存入mysql数据库操作示例
2019/05/25 PHP
PHP下载文件函数与用法示例
2019/09/27 PHP
jquery创建div 实现代码
2009/04/27 Javascript
ExtJS 学习专题(一) 如何应用ExtJS(附实例)
2010/03/11 Javascript
关于JavaScript中string 的replace
2013/04/12 Javascript
JS获取html对象的几种方式介绍
2013/12/05 Javascript
jquery实现select选中行、列合计示例
2014/04/25 Javascript
jQuery中attr()和prop()在修改checked属性时的区别
2014/07/18 Javascript
AngularJS基础 ng-class-odd 指令示例
2016/08/01 Javascript
BootStrap+Mybatis框架下实现表单提交数据重复验证
2017/03/23 Javascript
Vue-cli-webpack搭建斗鱼直播步骤详解
2017/11/17 Javascript
关于Vue单页面骨架屏实践记录
2017/12/13 Javascript
vue 下列表侧滑操作实例代码详解
2018/07/24 Javascript
Vue 动态添加路由及生成菜单的方法示例
2019/06/20 Javascript
你可能从未使用过的11+个JavaScript特性(小结)
2020/01/08 Javascript
vue-cli点击实现全屏功能
2020/03/07 Javascript
JavaScript中跨域问题的深入理解
2021/03/04 Javascript
python中字符串比较使用is、==和cmp()总结
2018/03/18 Python
Python设计模式之简单工厂模式实例详解
2019/01/22 Python
python读取目录下所有的jpg文件,并显示第一张图片的示例
2019/06/13 Python
Python加载数据的5种不同方式(收藏)
2020/11/13 Python
如何用css3实现switch组件开关的方法
2018/02/09 HTML / CSS
css3实现椭圆轨迹旋转的示例代码
2018/10/29 HTML / CSS
化学相关工作求职信
2013/10/02 职场文书
小学生获奖感言范文
2014/02/02 职场文书
品牌转让协议书
2014/08/20 职场文书
学用政策心得体会
2014/09/10 职场文书
2014年创卫工作总结
2014/11/24 职场文书
导游词之秦皇岛燕塞湖
2020/01/03 职场文书