Tornado Web服务器中处理空白字符的解决方案

 更新时间:2015年01月21日 09:05:01   投稿:junjie  
这篇文章主要介绍了Tornado Web服务器中处理空白字符的解决方案,本文通过修改Tornado源码解决这个问题,需要的朋友可以参考下

Tornado模板引擎一直有一个坑,有时候你可能觉得并不影响正常使用,但强迫症就是受不了:模板会去掉每行前后的空格。

最后出来的页面就是这样:

不缩进真的很影响心情的好吧,特别是对一个python开发者。

国外一些Q&A对这个情况也有一些讨论,其中提到比较多的就是compress_whitespace。在github找到一个issue:https://github.com/tornadoweb/tornado/issues/178,就是在抱怨空白字符的问题。空白字符在<pre>中被去除,导致代码标签“<pre>”这块出问题。

我们看看tornado代码吧,这是Template类的构造函数:

复制代码 代码如下:

def __init__(self, template_string, name="<string>", loader=None,
             compress_whitespace=None, autoescape=_UNSET):
    self.name = name
    if compress_whitespace is None:
        compress_whitespace = name.endswith(".html") or \
            name.endswith(".js")

其中有个compress_whitespace参数,当name(模板地址)是以.html或.js结尾的时候,将compress_whitespace为真。

实际上最后在generate函数里,处理空格的代码:

复制代码 代码如下:

if writer.compress_whitespace and "<pre>" not in value:
    value = re.sub(r"([\t ]+)", " ", value)
    value = re.sub(r"(\s*\n\s*)", "\n", value)

当compress_whitespace为真,且html里没有"<pre>"的时候进入这个if语句。"<pre>"这个我估计就是解决上面那个issue用的,但明显是一个非常不pythonic的方式。

经过一番分析,可以发现,有这样一些方法可以避免“缩进”被去除:

1.Template的构造函数中,传入compress_whitespace=False。
2.在模板中加入"<pre>"。
3.模板文件不为.html或.js后缀,可以为.htm或.tpl等。
4.修改核心库代码。

第2种方法肯定是最烂的,不可能为了缩进问题去改模板。第3种方法只能算一个权衡之计,去避免麻烦而不是解决麻烦,不是我的风格,而且后缀改了往往影响编辑器里的代码高亮和代码补全。第1种方法应该是最好的,但实际上,我们在controller里调用模板是使用render()或render_string()来做的,而这两个函数是封装了Template对象的创建过程,我们根本接触不到Template的构造函数,所以也没法控制compress_whitespace的值。

所以希望官方能进行修改,让代码能pythonic。

我这里用第4种方法,直接去修改Tornado核心代码,将这几句注释掉:

相关文章

  • Apache Hudi的多版本清理服务彻底讲解

    Apache Hudi的多版本清理服务彻底讲解

    这篇文章主要为大家详细彻底的介绍了Apache Hudi的多版本清理服务,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-03-03
  • 云服务器Centos中安装Docker的方法小结

    云服务器Centos中安装Docker的方法小结

    Docker是一个开源的应用容器引擎,利用操作系统本身已有的机制和特性,可以实现远超传统虚拟机的轻量级虚拟化,CentOS是Linux发行版之一,本文给大家介绍云服务器Centos中安装Docker的方法,感兴趣的朋友一起看看吧
    2023-12-12
  • centos服务器常用清理脚本分享

    centos服务器常用清理脚本分享

    做开发时,经常遇到服务器监控报警,日志占据大量的磁盘空间,需要清理,每次手动清理很麻烦,这里分享一些定时清理的脚本,减轻运维的工作量,这篇文章主要介绍了centos服务器常用清理脚本分享,需要的朋友可以参考下
    2024-05-05
  • 服务器安装conda环境遇到代理PROXY问题及解决方案

    服务器安装conda环境遇到代理PROXY问题及解决方案

    这篇文章主要为大家介绍了服务器安装conda环境遇到代理PROXY问题及解决方案,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • 如何从Steam社区屏蔽分析绕过方法及ASF安全部署

    如何从Steam社区屏蔽分析绕过方法及ASF安全部署

    这篇文章主要介绍了从Steam社区屏蔽分析绕过方法及ASF安全部署,本文主要记录在Ubuntu(Linux)服务器上的部署教程,但对于没有用过ASF并不熟悉Nginx的萌新来说,还是建议在Windows上调试成功后再转到云服务器上,需要的朋友可以参考下
    2024-05-05
  • 阿里云安全规则配置详解

    阿里云安全规则配置详解

    这篇文章主要介绍了阿里云安全规则配置详解,如果你不将端口设置安全规则,浏览器是无法访问到的,那么安全规则配置到底是怎么配的呢?详见如下
    2019-12-12
  • Centos7使用docker搭建gitlab服务器

    Centos7使用docker搭建gitlab服务器

    这篇文章主要为大家详细介绍了Centos7使用docker搭建gitlab服务器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • IBM服务器诊断面板使用方法

    IBM服务器诊断面板使用方法

    IBM服务器一般会有一个服务器操作员信息面板(诊断面板),服务器一般的硬件故障都会在诊断面板上提示,但这些提示可能只是一个大概的诊断故障,有助于系统管理员更好的维护
    2018-05-05
  • 简单粗暴的Caddy Server 使用介绍

    简单粗暴的Caddy Server 使用介绍

    Caddy是一个Go写的服务器软件,官方的宣传语The HTTP/2 web server with automatic HTTPS以及Serve The Web Like It is 2016简明表达了这个软件的优点和趋势,它拥有基本的apache或者nginx有的web server模块,同时还有一些很有特色的功能
    2016-11-11
  • 华为RAID 1阵列卡设置教程图文详解

    华为RAID 1阵列卡设置教程图文详解

    这篇文章主要介绍了华为RAID 1阵列卡设置教程图文详解,需要的朋友可以参考下
    2016-04-04

最新评论