介绍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 相关文章推荐
easy_install python包安装管理工具介绍
Feb 10 Python
Python入门之modf()方法的使用
May 15 Python
Python编程中使用Pillow来处理图像的基础教程
Nov 20 Python
Python利用递归实现文件的复制方法
Oct 27 Python
使用Python自动生成HTML的方法示例
Aug 06 Python
python实现发送form-data数据的方法详解
Sep 27 Python
pytorch:实现简单的GAN示例(MNIST数据集)
Jan 10 Python
Python matplotlib画曲线例题解析
Feb 07 Python
Pycharm连接远程服务器过程图解
Apr 30 Python
为什么说python更适合树莓派编程
Jul 20 Python
scrapy实践之翻页爬取的实现
Jan 05 Python
Pygame Time时间控制的具体使用详解
Nov 17 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 多个submit提交表单 处理方法
2009/07/07 PHP
php基于PDO连接MSSQL示例DEMO
2016/07/13 PHP
解决出现SoapFault (looks like we got no XML document)的问题
2017/06/24 PHP
Javascript this 的一些学习总结
2012/08/02 Javascript
js动态创建标签示例代码
2014/06/09 Javascript
js的window.showModalDialog及window.open用法实例分析
2015/01/29 Javascript
实例讲解避免javascript冲突的方法
2016/01/03 Javascript
Nodejs--post的公式详解
2017/04/29 NodeJs
JS获取短信验证码倒计时的实现代码
2017/05/22 Javascript
原生js实现简单的链式操作
2017/07/04 Javascript
JS函数本身的作用域实例分析
2020/03/16 Javascript
Python版实现微信公众号扫码登陆
2020/05/28 Javascript
仿照Element-ui实现一个简易的$message方法
2020/09/14 Javascript
javascript实现简易计算器功能
2020/09/23 Javascript
[12:21]VICI vs TNC (BO3)
2018/06/07 DOTA
python UNIX_TIMESTAMP时间处理方法分析
2016/04/18 Python
对比Python中__getattr__和 __getattribute__获取属性的用法
2016/06/21 Python
Python中你应该知道的一些内置函数
2017/03/31 Python
Python简单定义与使用字典dict的方法示例
2017/07/25 Python
numpy.std() 计算矩阵标准差的方法
2018/07/11 Python
Python中的CSV文件使用"with"语句的方式详解
2018/10/16 Python
pycharm修改界面主题颜色的方法
2019/01/17 Python
深入浅析Python中的迭代器
2019/06/04 Python
python如何通过pyqt5实现进度条
2020/01/20 Python
HTML5拖拽功能实现的拼图游戏
2018/07/31 HTML / CSS
Strawberrynet草莓网新加坡站:护肤、彩妆、香水及美发产品
2018/08/31 全球购物
函授本科毕业生自我鉴定
2013/10/16 职场文书
2014年综合治理工作总结
2014/11/20 职场文书
写给妈妈的感谢信
2015/01/22 职场文书
中秋客户感谢信
2015/01/22 职场文书
入党介绍人意见2015
2015/06/01 职场文书
单位政审意见范文
2015/06/04 职场文书
寻找最美乡村教师观后感
2015/06/18 职场文书
运动会运动员赞词
2015/07/22 职场文书
Redis 持久化 RDB 与 AOF的执行过程
2021/11/07 Redis
Vue如何清空对象
2022/03/03 Vue.js