介绍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 相关文章推荐
wxpython中利用线程防止假死的实现方法
Aug 11 Python
Python自动化构建工具scons使用入门笔记
Mar 10 Python
Python中decorator使用实例
Apr 14 Python
用PyQt进行Python图形界面的程序的开发的入门指引
Apr 14 Python
在Django同1个页面中的多表单处理详解
Jan 25 Python
Python3.4 tkinter,PIL图片转换
Jun 21 Python
详解python opencv、scikit-image和PIL图像处理库比较
Dec 26 Python
python2和python3哪个使用率高
Jun 23 Python
Python制作简单的剪刀石头布游戏
Dec 10 Python
python 制作网站小说下载器
Feb 20 Python
浅谈Python3中datetime不同时区转换介绍与踩坑
Aug 02 Python
Python实现抖音热搜定时爬取功能
Mar 16 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
索尼SONY SRF-S83/84电路分析和打磨
2021/03/02 无线电
php中的curl_multi系列函数使用例子
2014/07/29 PHP
php实现简单的MVC框架实例
2015/09/23 PHP
WordPress中用于获取文章信息以及分类链接的函数用法
2015/12/18 PHP
PHP+Ajax简单get验证操作示例
2019/03/02 PHP
Laravel模糊查询区分大小写的实例
2019/09/29 PHP
JavaScript Timer实现代码
2010/02/17 Javascript
jQuery实现自定义checkbox和radio样式
2015/07/13 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
2016/05/24 Javascript
js鼠标经过tab选项卡时实现切换延迟
2017/03/24 Javascript
JavaScript实现实时更新系统时间的实例代码
2017/04/04 Javascript
初识 Vue.js 中的 *.Vue文件
2017/11/22 Javascript
使用Vue-cli 3.0搭建Vue项目的方法
2018/06/07 Javascript
Angular项目如何升级至Angular6步骤全纪录
2018/09/03 Javascript
基于jquery实现的tab选项卡功能示例【附源码下载】
2019/06/10 jQuery
layui点击弹框页面 表单请求的方法
2019/09/21 Javascript
浅析我对JS延迟异步脚本的思考
2020/10/12 Javascript
[00:58]他们到底在电话里听到了什么?
2017/11/21 DOTA
Python 列表list使用介绍
2014/11/30 Python
Python数据可视化正态分布简单分析及实现代码
2017/12/04 Python
python版本的仿windows计划任务工具
2018/04/30 Python
Python使用gRPC传输协议教程
2018/10/16 Python
TensorFlow基于MNIST数据集实现车牌识别(初步演示版)
2019/08/05 Python
解决python 3 urllib 没有 urlencode 属性的问题
2019/08/22 Python
Python爬虫实现“盗取”微信好友信息的方法分析
2019/09/16 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
2021/03/03 Python
利用 CSS3 实现的无缝轮播功能代码
2017/09/25 HTML / CSS
DC Shoes官网:美国滑板鞋和服饰品牌
2017/09/03 全球购物
俄罗斯皮肤健康中心:Pharmacosmetica.ru
2020/02/22 全球购物
Java程序员面试题
2013/07/15 面试题
在DELPHI中调用存储过程和使用内嵌SQL哪种方式更好
2016/11/22 面试题
幼儿园春游活动方案
2014/01/19 职场文书
大型会议策划方案
2014/05/17 职场文书
教师党员岗位承诺书
2014/05/29 职场文书
法英专业大学生职业生涯规划书范文
2014/09/22 职场文书
解析MySQL索引的作用
2022/03/03 MySQL