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

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核心代码,将这几句注释掉:

(0)

相关推荐

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

    Tornado模板引擎一直有一个坑,有时候你可能觉得并不影响正常使用,但强迫症就是受不了:模板会去掉每行前后的空格. 最后出来的页面就是这样: 不缩进真的很影响心情的好吧,特别是对一个python开发者. 国外一些Q&A对这个情况也有一些讨论,其中提到比较多的就是compress_whitespace.在github找到一个issue:https://github.com/tornadoweb/tornado/issues/178,就是在抱怨空白字符的问题.空白字符在<pre>中被去除

  • Tornado Web服务器多进程启动的2个方法

    一.Tornado简介 Tornado 是 FriendFeed 的 Web 服务器及其常用工具的开源版本.Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快.得利于其 非阻塞的方式和对epoll的运用,Tornado 每秒可以处理数以千计的连接,因此 Tornado 是实时 Web 服务的一个理想框架. 二.多进程启动方法 正常启动方法: 复制代码 代码如下: server = HTTPServer(app)

  • 在 Ubuntu 15.04/CentOS 7 中安装 Lighttpd Web 服务器的方法

    Lighttpd 是一款开源 Web 服务器软件.Lighttpd 安全快速,符合行业标准,适配性强并且针对高配置环境进行了优化.相对于其它的 Web 服务器而言,Lighttpd 占用内存更少:因其对 CPU 占用小和对处理速度的优化而在效率和速度方面从众多 Web 服务器中脱颖而出.而 Lighttpd 诸如 FastCGI.CGI.认证.输出压缩.URL 重写等高级功能更是那些面临性能压力的服务器的福音. 以下便是我们在运行 Ubuntu 15.04 或 CentOS 7 Linux 发行

  • 浅谈web服务器项目中静态请求和动态请求处理

    注:完整项目下载 在处理了核心任务之后,我们会发现有些请求并不是都是静态的,那么我们就需要进行实现处理动态请求的要求,如下面代码是我们请求的解决方式,我们只需在HttpRequestImpl实现类中,将如下代码实现具体的判断过程 //判断当前请求的否是静态资源 public boolean isStaticResource(){ return true; } //判断当前请求的否是动态资源 public boolean isDynamicResource(){ return true; } 1.

  • WEB服务器大比拼,评析六大流派

    摘要 有时候Apache给人的感觉是无处不在,每个人都在运行Apache,甚至包括它们的狗也运行有自己的Apache .但是即使如此,仍然有很多种其他的Web服务器可供选择.本文就对目前市场上主流Web服务器进行全面的比较. Apache无处不在,可以运行在包括Linux.Soloris等多种系统平台之上.Apache在网络市场是无可争议的领头羊.几乎在任何一本关于网络管理的教程中关于Web服务器内容讨论的都是Apache.当然选择Apache是由很多非常充足的原因的,毕竟一千六百万用户(根据N

  • 如何用PHP来实现一个动态Web服务器

    要是现实一个 web 服务器,那么就需要大概了解 web 服务器的运行原理.先从静态的文本服务器开始,以访问 web 服务器的1.html为例 1.客户端通过发送一个 http 请求到服务器,如果服务器监听的端口号是9002,那么在本机自身测试访问的地址就是http://localhost:9002/1.html. 2.服务器监听着9002端口,那么在收到请求了请求之后,就能从 http head 头中获取到请求里需要访问的 uri 资源在web 目录中的位置. 3.服务器读取需要访问的资源文件

  • PHP实现动态web服务器方法

    以下内容通过图文并茂的方式介绍php实现动态web服务器的方法,具体内容如下: 本文所实现的服务器仅仅是演示和理解原理所用,力求简单易懂.有兴趣的朋友可以继续深入改造 要是现实一个 web 服务器,那么就需要大概了解 web 服务器的运行原理.先从静态的文本服务器开始,以访问 web 服务器的1.html为例 1.客户端通过发送一个 http 请求到服务器,如果服务器监听的端口号是9002,那么在本机自身测试访问的地址就是 http://localhost:9002/1.html . 2.服务器

  • Windows Server 2008 架设 Web 服务器教程(图文详解)

    一.安装 IIS 7.0 : 虽然 Windows Server 2008 内置了I IS 7.0,但是默认情况下并没有安装.由于 Windows Server 2008 中安装 IIS 服务和以前操作相比有很大的不同,因此首先要首先需要参照下述步骤安装 IIS 7.0 组件. 后来笔者又在 windows server 2012 上试了 iis,版本是 8,本文中也有截图提及. 1:开始 - 服务器管理器 - 角色 - 添加角色 : 2:勾选 Web服务器(IIS),接着可以查看到对 Web

  • web服务器集群(多台web服务器)session同步、共享的3种解决方法

    在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,一个登录用户,一会是登录状态,一会又不是登录状态.所以本文就根据这种情况给出三种不同的方法来解决这个问题: 一.利用数据库同步session 在做多服务器session同步时我没有用这种方法,如果非要用这种方法的话,我想过二种方法: 1,用一个低端电脑建个数据库专门存放web服务器的session,或者,把这个专门的数据库建在文件服务器上

  • 利用python实现对web服务器的目录探测的方法

    一.python Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. python 是一门简单易学的语言,并且功能强大也很灵活,在渗透测试中的应用广泛,让我们一起打造属于自己的渗透测试工具 二.web服务器的目录探测脚本打造 1.在渗透时如果能发现web服务器中的webshell,渗透是不是就可以变的简单一点尼 通常情况下御剑深受大家的喜爱,但是今天在测试的时候webshell不知道为什么御剑扫描不到 仔细查看是webshell有防爬功能,是检测User-Agent头,如果没有

随机推荐