介绍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多线程编程(四):使用Lock互斥锁
Apr 05 Python
Python验证码识别的方法
Jul 10 Python
python学习 流程控制语句详解
Jun 01 Python
结合Python的SimpleHTTPServer源码来解析socket通信
Jun 27 Python
Python3一行代码实现图片文字识别的示例
Jan 15 Python
深入浅析Python2.x和3.x版本的主要区别
Nov 30 Python
浅谈对pytroch中torch.autograd.backward的思考
Dec 27 Python
Matplotlib绘制雷达图和三维图的示例代码
Jan 07 Python
python给图像加上mask,并提取mask区域实例
Jan 19 Python
Python开发企业微信机器人每天定时发消息实例
Mar 17 Python
python怎么调用自己的函数
Jul 01 Python
PyTorch dropout设置训练和测试模式的实现
May 27 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 aes (ecb)解密后乱码问题
2015/06/22 PHP
最新版本PHP 7 vs HHVM 多角度比较
2016/02/14 PHP
document对象execCommand的command参数介绍
2006/08/01 Javascript
prototype 1.5 & scriptaculous 1.6.1 学习笔记
2006/09/07 Javascript
JScript中的undefined和"undefined"的区别
2007/03/08 Javascript
JavaScript 获得选中文本内容的方法
2009/02/15 Javascript
js禁止小键盘输入数字功能代码
2011/08/01 Javascript
Nodejs sublime text 3安装与配置
2014/06/19 NodeJs
谈谈JavaScript中function多重理解
2015/08/28 Javascript
初步了解javascript面向对象
2015/11/09 Javascript
bootstrap下拉列表与输入框组结合的样式调整
2016/10/08 Javascript
微信小程序 本地数据读取实例
2017/04/27 Javascript
Node.js 使用命令行工具检查更新
2017/06/08 Javascript
浅谈angular.copy() 深拷贝
2017/09/14 Javascript
jQuery实现文字超过1行、2行或规定的行数时自动加省略号的方法
2018/03/28 jQuery
小程序实现抽奖动画
2020/04/16 Javascript
详解vue开发中调用微信jssdk的问题
2019/04/16 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
2019/05/18 Javascript
Layui实现主窗口和Iframe层参数传递
2019/11/14 Javascript
浅谈Node新版本13.2.0正式支持ES Modules特性
2019/11/25 Javascript
vue 使用插槽分发内容操作示例【单个插槽、具名插槽、作用域插槽】
2020/03/06 Javascript
nodejs+koa2 实现模仿springMVC框架
2020/10/21 NodeJs
js基于canvas实现时钟组件
2021/02/07 Javascript
[03:03]DOTA2 2017国际邀请赛开幕战队入场仪式
2017/08/09 DOTA
Python读取文件内容的三种常用方式及效率比较
2017/10/07 Python
python 通过xml获取测试节点和属性的实例
2018/03/31 Python
pycharm创建一个python包方法图解
2019/04/10 Python
接口自动化多层嵌套json数据处理代码实例
2020/11/20 Python
python爬虫搭配起Bilibili唧唧的流程分析
2020/12/01 Python
Pandas的数据过滤实现
2021/01/15 Python
请解释一下webService? 如何用.net实现webService
2014/06/09 面试题
《广玉兰》教学反思
2014/04/14 职场文书
街道务虚会发言材料
2014/10/20 职场文书
2015年依法治校工作总结
2015/07/27 职场文书
美容院管理规章制度
2015/08/05 职场文书
基于Python实现nc批量转tif格式
2022/08/14 Python