当前位置: 首页 > 编程笔记 >

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

耿星雨
2023-03-14
本文向大家介绍Tornado Web服务器中处理空白字符的解决方案,包括了Tornado Web服务器中处理空白字符的解决方案的使用技巧和注意事项,需要的朋友参考一下

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

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

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

国外一些Q&A对这个情况也有一些讨论,其中提到比较多的就是compress_whitespace。在github找到一个issue:https://github.com/tornadoweb/tornado/issues/178,就是在抱怨空白字符的问题。空白字符在<pre>中被去除,导致代码html" target="_blank">标签“<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核心代码,将这几句注释掉:

 类似资料:
  • white-space属性用来设置文本内空白符(如空格、回车、tab字符等)的处理方式,可选值有 normal | pre | nowrap | pre-wrap | pre-line,默认值为 normal。该属性出自 CSS1,在 CSS 2.1中新增了属性值 pre-wrap 和 pre-line。不同取值的含义见表 3‑6: 表 3‑6 white-space属性的取值及含义 属性值 含义

  • 在运行中,模板中的 空白 处理在某种程度上来说是纠缠所有模板引擎的一个问题。 我们来看这个模板。我已经用颜色标记了模板中的组件: 文本, 插值, FTL 标签.。 使用 [BR] 来想象 换行。 <p>List of users:[BR] <#assign users = [{"name":"Joe", "hidden":false},[BR] {

  • 问题内容: 给定输入字符串,例如,在Go中将其拆分为字符串数组的最佳方法是什么?请注意,每个单词之间可以有_任意_数量的空格或Unicode空格字符。 在Java中,我只会使用。 (注意:在Go中使用正则表达式可能重复的Split字符串不会给出任何高质量的答案。请提供实际示例,而不仅仅是提供指向或包引用的链接。) 问题答案: 所述封装具有一个方法。 演示: http : //play.golang

  • 问题 你想清理字符串前后的空白符。 解决方案 使用 JavaScript 的正则表达式来替换空白符。 要清理字符串前后的空白符,可以使用以下代码: " padded string ".replace /^\s+|\s+$/g, "" # => 'padded string' 如果只想清理字符串前面的空白符,使用以下代码: " padded string ".replace /^\s+/g,

  • 本文向大家介绍tomcat服务器宕机解决方案,包括了tomcat服务器宕机解决方案的使用技巧和注意事项,需要的朋友参考一下 报错信息: 每次出现这个报错都会导致tomcat应用服务器停机,加了下面的java代码后就再也没有停过了。 解决办法: 编写Java代码 @WebListener,这个注解相当于在web.xml配置如下内容 解决方案可以参考如下网址 当然还有就是我再参考这个解决方案的时候,发

  • 本文向大家介绍tensorboard显示空白的解决,包括了tensorboard显示空白的解决的使用技巧和注意事项,需要的朋友参考一下 ubuntu 14.04 + python3.4 + chrome, 在浏览器中查看tensorboard, 发现出了graph,其他的数据都是空白。 通过分析,发现js中如下一些错误 Uncaught SyntaxError: Block-scoped decl