介绍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中使用Mako模版库的简单教程
Apr 08 Python
Django模板变量如何传递给外部js调用的方法小结
Jul 24 Python
Django中login_required装饰器的深入介绍
Nov 24 Python
基于Python log 的正确打开方式
Apr 28 Python
Python创建一个空的dataframe,并循环赋值的方法
Nov 08 Python
Python小工具之消耗系统指定大小内存的方法
Dec 03 Python
手把手教你使用Python创建微信机器人
Apr 29 Python
Python:slice与indices的用法
Nov 25 Python
Python实现图片批量加入水印代码实例
Nov 30 Python
python中数据库like模糊查询方式
Mar 02 Python
详解Python魔法方法之描述符类
May 26 Python
python游戏开发Pygame框架
Apr 22 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(1) php开发环境配置
2010/02/15 PHP
destoon调用企业会员公司形象图片的实现方法
2014/08/21 PHP
php简单创建zip压缩文件的方法
2016/04/30 PHP
php字符串的替换,分割和连接方法
2016/05/23 PHP
PHP中in_array函数使用的问题与解决办法
2016/09/11 PHP
php微信公众账号开发之前五个坑(一)
2016/09/18 PHP
php中yar框架实例用法讲解
2020/12/27 PHP
jquery实现的Accordion折叠面板效果代码
2015/09/02 Javascript
Centos7 Python3下安装scrapy的详细步骤
2018/03/15 Python
基于Python列表解析(列表推导式)
2018/06/23 Python
Python中logging.NullHandler 的使用教程
2018/11/29 Python
Python嵌套式数据结构实例浅析
2019/03/05 Python
python实现坦克大战游戏 附详细注释
2020/03/27 Python
详解用pyecharts Geo实现动态数据热力图城市找不到问题解决
2019/06/26 Python
python程序运行进程、使用时间、剩余时间显示功能的实现代码
2019/07/11 Python
Python实现Selenium自动化Page模式
2019/07/14 Python
Python中使用gflags实例及原理解析
2019/12/13 Python
python-docx文件定位读取过程(尝试替换)
2020/02/13 Python
详解Ubuntu环境下部署Django+uwsgi+nginx总结
2020/04/02 Python
html5 css3网站菜单实现代码
2013/12/23 HTML / CSS
three.js模拟实现太阳系行星体系功能
2019/09/03 HTML / CSS
柯基袜:Corgi Socks
2017/01/26 全球购物
戴尔美国官方折扣店:Dell Outlet
2018/02/13 全球购物
blueseventy官网:铁人三项和比赛泳衣
2021/02/06 全球购物
SIMON MILLER官网:洛杉矶的生活方式品牌
2020/10/19 全球购物
广州迈达威.net面试题目
2012/03/10 面试题
介绍一下Python中webbrowser的用法
2013/05/07 面试题
电气自动化自荐信
2013/10/10 职场文书
配件采购员岗位职责
2013/12/03 职场文书
三好学生自我鉴定
2013/12/17 职场文书
《假如》教学反思
2014/04/17 职场文书
五一口号
2014/06/19 职场文书
农村党支部书记党群众路线四风问题整改措施
2014/09/26 职场文书
php 原生分页
2021/04/01 PHP
Python激活Anaconda环境变量的详细步骤
2021/06/08 Python
html5+实现plus.io进行拍照和图片等获取
2022/06/01 HTML / CSS