介绍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基础教程之数字处理(math)模块详解
Mar 25 Python
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
Jul 06 Python
tensorflow TFRecords文件的生成和读取的方法
Feb 06 Python
python xlsxwriter库生成图表的应用示例
Mar 16 Python
Python中创建二维数组
Oct 17 Python
Django实现学员管理系统
Feb 26 Python
python文本数据处理学习笔记详解
Jun 17 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
Aug 04 Python
python 19个值得学习的编程技巧
Aug 15 Python
Python使用Kubernetes API访问集群
May 30 Python
Python标准库之typing的用法(类型标注)
Jun 02 Python
Python面试不修改数组找出重复的数字
May 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验证码(支持中文)
2007/02/14 PHP
php switch语句多个值匹配同一代码块的实现
2014/03/03 PHP
ThinkPHP在新浪SAE平台的部署实例
2014/10/31 PHP
PHP基于单例模式实现的mysql类
2016/01/09 PHP
php文件缓存方法总结
2016/03/16 PHP
PHP简单数据库操作类实例【支持增删改查及链式操作】
2016/10/10 PHP
基于PHP的微信公众号的开发流程详解
2020/08/07 PHP
Aptana调试javascript图解教程
2009/11/30 Javascript
Underscore.js 的模板功能介绍与应用
2012/12/24 Javascript
js实现的GridView即表头固定表体有滚动条且可滚动
2014/02/19 Javascript
js实现索引图片切换效果
2015/11/21 Javascript
AngularJS页面访问时出现页面闪烁问题的解决
2016/03/06 Javascript
详解Javascript中new()到底做了些什么?
2018/03/29 Javascript
vue中的$emit 与$on父子组件与兄弟组件的之间通信方式
2018/05/13 Javascript
JavaScript选择排序算法原理与实现方法示例
2018/08/06 Javascript
koa2+vue实现登陆及登录状态判断
2019/08/15 Javascript
Python open()文件处理使用介绍
2014/11/30 Python
对python-3-print重定向输出的几种方法总结
2018/05/11 Python
Flask框架重定向,错误显示,Responses响应及Sessions会话操作示例
2019/08/01 Python
python3 求约数的实例
2019/12/05 Python
pycharm设置python文件模板信息过程图解
2020/03/10 Python
Python生成器常见问题及解决方案
2020/03/21 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
2020/11/12 Python
python 通过exifread读取照片信息
2020/12/24 Python
HTML5对手机页面长按会粘贴复制禁用的解决方法
2016/07/19 HTML / CSS
单位办理社保介绍信
2014/01/10 职场文书
《鱼游到了纸上》教学反思
2014/02/20 职场文书
根叔历年演讲稿
2014/05/20 职场文书
音乐兴趣小组活动总结
2014/07/07 职场文书
改进作风怎么办发言材料
2014/08/17 职场文书
国企干部对照检查材料
2014/08/22 职场文书
教师个人考察材料
2014/12/16 职场文书
先进个人总结范文
2015/02/15 职场文书
2015年乡镇卫生院工作总结
2015/04/22 职场文书
JavaScript 语句之常用 for 循环详解
2021/03/29 Javascript
python中使用redis用法详解
2022/12/24 Redis