介绍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的即时标记项目练习笔记
Sep 18 Python
Python实现子类调用父类的方法
Nov 10 Python
读写json中文ASCII乱码问题的解决方法
Nov 05 Python
python OpenCV学习笔记之绘制直方图的方法
Feb 08 Python
详解将Python程序(.py)转换为Windows可执行文件(.exe)
Jul 19 Python
python 基于dlib库的人脸检测的实现
Nov 08 Python
在python中利用try..except来代替if..else的用法
Dec 19 Python
pytorch中的卷积和池化计算方式详解
Jan 03 Python
jupyter notebook读取/导出文件/图片实例
Apr 16 Python
详细分析Python垃圾回收机制
Jul 01 Python
pandas to_excel 添加颜色操作
Jul 14 Python
如何一键升级Python所有包
Nov 05 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自动反斜杠的函数代码
2010/01/05 PHP
PHP备份/还原MySQL数据库的代码
2011/01/06 PHP
linux环境apache多端口配置虚拟主机的方法深入介绍
2013/06/09 PHP
提高PHP编程效率的方法
2013/11/07 PHP
ajax+php控制所有后台函数调用
2015/07/15 PHP
js类中的公有变量和私有变量
2008/07/24 Javascript
js 复制或插入Html的实现方法小结
2010/05/19 Javascript
jquery选择器大全 全面详解jquery选择器
2014/03/06 Javascript
Node.js中npm常用命令大全
2016/06/09 Javascript
Vue.JS入门教程之事件监听
2016/12/01 Javascript
微信小程序 图片绝对定位(背景图片)
2017/04/05 Javascript
requirejs + vue 项目搭建详解
2017/06/16 Javascript
jQuery实现动态加载select下拉列表项功能示例
2018/05/31 jQuery
JS实现动态添加外部js、css到head标签的方法
2019/06/05 Javascript
js Array.slice的8种不同用法示例
2019/07/10 Javascript
vue路由结构可设一层方便动态添加路由操作
2020/08/31 Javascript
Openlayers3实现车辆轨迹回放功能
2020/09/29 Javascript
JavaScript实现切换多张图片
2021/01/27 Javascript
基于python实现的抓取腾讯视频所有电影的爬虫
2016/04/22 Python
详细介绍Python的鸭子类型
2016/09/12 Python
网站渗透常用Python小脚本查询同ip网站
2017/05/08 Python
Python微信公众号开发平台
2018/01/25 Python
python编程使用selenium模拟登陆淘宝实例代码
2018/01/25 Python
Python中xml和json格式相互转换操作示例
2018/12/05 Python
通过shell+python实现企业微信预警
2019/03/07 Python
Django项目创建到启动详解(最全最详细)
2019/09/07 Python
pytorch实现focal loss的两种方式小结
2020/01/02 Python
pyinstaller打包单文件时--uac-admin选项不起作用怎么办
2020/04/15 Python
python 实现ping测试延迟的两种方法
2020/12/10 Python
澳大利亚优质的家居用品和生活方式公司:Bed Bath N’ Table
2019/04/16 全球购物
优秀团员自我评价范文
2014/04/23 职场文书
一体化教学实施方案
2014/05/10 职场文书
群众路线教育实践活动的心得体会
2014/09/03 职场文书
活动总结模板大全
2015/05/11 职场文书
南京南京观后感
2015/06/02 职场文书
浅谈mysql增加索引不生效的几种情况
2021/06/23 MySQL