介绍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的re模块应用实例
Sep 26 Python
Python列表append和+的区别浅析
Feb 02 Python
python处理图片之PIL模块简单使用方法
May 11 Python
解决phantomjs截图失败,phantom.exit位置的问题
May 17 Python
Python实现的爬虫刷回复功能示例
Jun 07 Python
python K近邻算法的kd树实现
Sep 06 Python
Python提取特定时间段内数据的方法实例
Apr 01 Python
Python 3.8 新功能全解
Jul 25 Python
jupyter notebook快速入门及使用详解
Nov 13 Python
Selenium 配置启动项参数的方法
Dec 04 Python
Python实现疫情地图可视化
Feb 05 Python
python数字图像处理实现图像的形变与缩放
Jun 28 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对文件夹进行相关操作(遍历、计算大小)
2015/11/04 PHP
PHP使用new StdClass()创建空对象的方法分析
2017/06/06 PHP
PHP7 标准库修改
2021/03/09 PHP
bgsound 背景音乐 的一些常用方法及特殊用法小结
2010/05/11 Javascript
juqery 学习之三 选择器 层级 基本
2010/11/25 Javascript
jQuery load方法用法集锦
2011/12/06 Javascript
JS实现判断碰撞的方法
2015/02/11 Javascript
鼠标经过子元素触发mouseout,mouseover事件的解决方案
2015/07/26 Javascript
jQuery+Ajax+PHP+Mysql实现分页显示数据实例讲解
2015/09/27 Javascript
javascript对象的创建和访问
2016/03/08 Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
2016/12/20 Javascript
fullCalendar中文API官方文档
2017/02/07 Javascript
JS与HTML结合实现流程进度展示条思路详解
2017/09/03 Javascript
通过源码分析Vue的双向数据绑定详解
2017/09/24 Javascript
vue.js默认路由不加载linkActiveClass问题的解决方法
2017/12/11 Javascript
一次Webpack配置文件的分离实战记录
2018/11/30 Javascript
javascript实现5秒倒计时并跳转功能
2019/06/20 Javascript
Python操作sqlite3快速、安全插入数据(防注入)的实例
2014/04/26 Python
Python数据结构与算法之字典树实现方法示例
2017/12/13 Python
利用python打开摄像头及颜色检测方法
2018/08/03 Python
Numpy之文件存取的示例代码
2018/08/03 Python
python修改字典键(key)的方法
2019/08/05 Python
pycharm双击无响应(打不开问题解决办法)
2020/01/10 Python
浅析python 动态库m.so.1.0错误问题
2020/05/09 Python
Selenium环境变量配置(火狐浏览器)及验证实现
2020/12/07 Python
CSS3 border-radius圆角的实现方法及用法详解
2020/09/14 HTML / CSS
html5如何在Canvas中实现自定义路径动画示例
2017/09/18 HTML / CSS
Boston Proper官网:美国女装品牌
2017/10/30 全球购物
曼城官方网上商店:Manchester City
2019/09/10 全球购物
是否有自动比较结构的方法
2015/06/03 面试题
工程专业求职自荐书范文
2014/02/08 职场文书
装饰公司活动策划方案
2014/08/23 职场文书
听证通知书
2015/04/24 职场文书
大学生创业,为什么都会选择快餐饮?
2019/08/08 职场文书
Go 语言中 20 个占位符的整理
2021/10/16 Golang
Python 数据可视化之Matplotlib详解
2021/11/02 Python