tornado template

30 views
Skip to first unread message

Kevin Jiang

unread,
Mar 29, 2013, 11:16:41 AM3/29/13
to pyth...@googlegroups.com
各位前辈大家好,问一个tornado模板的问题。

有两个模板:
base.html
home.html

#base.html
{% block content %}{% end %}

#home.html
{% block content %}
<div>
    <div>something here</div>
</div>
{% end %}


最后的结果变成了
<div>
<div>somethine here</div>
</div>
第二个div标签前面的4个空格没有了,大家有碰到过这个情况吗,要如何解决

谢谢

--

Life is short, use Python.

依云

unread,
Mar 29, 2013, 11:52:04 AM3/29/13
to pyth...@googlegroups.com
On Fri, Mar 29, 2013 at 11:16:41PM +0800, Kevin Jiang wrote:
> 各位前辈大家好,问一个tornado模板的问题。
>
> 有两个模板:
> base.html
> home.html
>
> #base.html
> {% block content %}{% end %}
>
> #home.html
> {% block content %}
> <div>
> <div>something here</div>
> </div>
> {% end %}
>
>
> 最后的结果变成了
> <div>
> <div>somethine here</div>
> </div>
> 第二个div标签前面的4个空格没有了,大家有碰到过这个情况吗,要如何解决
>
> 谢谢

我记得它会自动移除一些空白的。(有次它给我把 <pre> 里的空白移走了……)

--
Best regards,
lilydjwg

Linux Vim Python 我的博客:
http://lilydjwg.is-programmer.com/
--
A: Because it obfuscates the reading.
Q: Why is top posting so bad?

YS.Zou

unread,
Mar 29, 2013, 11:59:39 AM3/29/13
to pyth...@googlegroups.com

On 03-29 23:16, Kevin Jiang wrote:

各位前辈大家好,问一个tornado模板的问题。

有两个模板:
base.html
home.html

#base.html
{% block content %}{% end %}

#home.html
{% block content %}
<div>
   <div>something here</div>
</div>
{% end %}


最后的结果变成了
<div>
<div>somethine here</div>
</div>
第二个div标签前面的4个空格没有了,大家有碰到过这个情况吗,要如何解决

作为 HTML 来说, 有没有那个空格都没有关系的吧.

首先, 这个东西是由 Template 的实例控制的, 初始化时有一个叫做 compress_whitespace 的参数, 相关源码:

  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")

可以看到, 默认情况下(不传 name ), 它是不会压缩空格的.

我猜你是在使用 RequestHandlerrender() 方法吧. 这个方法会使用 Loader 的实例去加载模板.它会传入你的模板文件名作为 name 参数的值, 所以, 最直接的方法就是, 改名你的模板文件 , 不使用 .html 结尾就可以了. 可以使用 .htm .

如果你不想改模板文件名, 那么根据 tornado 现有的机制, 你可以在 Applicationsettings 部分指定一个 Loader 实例, 看一下源码, 继承 Loader 类重写一个方法即可:

  from tornado.template import Loader, Template
  
  class MyLoader(Loader):
      def _create_template(self, name):
          path = os.path.join(self.root, name)
          f = open(path, "rb")
          template = Template(f.read(), name=name, loader=self,
                              compress_whitespace=False)  //  <--- 直接传入这个参数
          f.close()
          return template

把自己的 MyLoader 用在 settings 中:

  class Application(tornado.web.Application):
      def __init__(self):
          settings = dict(
              xsrf_cookies=False,
              static_path = join(os.path.dirname(__file__), "static"),
              template_path = join(os.path.dirname(__file__), "template"),
              ui_modules = ui,
              debug=config.DEBUG,
          )
          settings['template_loader'] = MyLoader(settings['template_path'])
          tornado.web.Application.__init__(self, Handlers, **settings)

--
进出自由才是游戏者的生存之道。

http://zouyesheng.com

AleiPhoenix (A.K.A Areverie)

unread,
Mar 29, 2013, 12:04:49 PM3/29/13
to CPyUG
稍微挖了一下源代码

主要在这里 有个compress_whitespace的参数



普通情况下,在handler里直接用render调用模板的话,会走如下流程

(web.py) render => render_string => 根据配置寻找template_loader,没有的话就默认loader

(template.py) Loader._create_template 的时候会去初始化Template 没带上这个参数,默认是None


可以注意到Template初始化时候是否去掉空白还会看后缀名,如果是.html和.js就会去掉。

所以有3种做法

1. 把模板文件后缀改掉

2. 自己写个template_loader

3. 改掉原来_create_template的地方


话说文档很悲剧,怎么搜都是到源代码233

估计写的人自己都不怎么用。。


2013/3/29 依云 <lily...@gmail.com>

--
--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: pyth...@googlegroups.com
退订: python-cn+...@googlegroups.com (向此发空信即退!)
详情: http://code.google.com/p/cpyug/wiki/CpyUg
G+: https://plus.google.com/u/0/communities/108786798869709602787
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了 Google 网上论坛的“python-cn(华蟒用户组,CPyUG 邮件列表)”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 python-cn+...@googlegroups.com
要查看更多选项,请访问 https://groups.google.com/groups/opt_out





--
Silence is golden.

twitter: @areverie
wikipedia: AleiPhoenix
blog: weblog.areverie.org
wiki: wiki.areverie.org

AleiPhoenix (A.K.A Areverie)

unread,
Mar 29, 2013, 12:13:05 PM3/29/13
to CPyUG
顺带补一个


那issue一直开着233


2013/3/30 AleiPhoenix (A.K.A Areverie) <aleip...@gmail.com>

YS.Zou

unread,
Mar 29, 2013, 12:24:28 PM3/29/13
to pyth...@googlegroups.com

On 03-30 00:13, AleiPhoenix (A.K.A Areverie) wrote:

顺带补一个

https://github.com/facebook/tornado/issues/178

那issue一直开着233

呵呵, 它刚正式放 3.0 出来了.

--
进出自由才是游戏者的生存之道。

http://zouyesheng.com

Kevin Jiang

unread,
Mar 30, 2013, 5:36:32 AM3/30/13
to pyth...@googlegroups.com
谢谢各位前辈,我把文件后缀改成htm


2013/3/30 YS.Zou <yeshe...@gmail.com>

--
--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: pyth...@googlegroups.com
退订: python-cn+...@googlegroups.com (向此发空信即退!)
详情: http://code.google.com/p/cpyug/wiki/CpyUg
G+: https://plus.google.com/u/0/communities/108786798869709602787
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了 Google 网上论坛的“python-cn(华蟒用户组,CPyUG 邮件列表)”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 python-cn+...@googlegroups.com
要查看更多选项,请访问 https://groups.google.com/groups/opt_out。
 
 



--
Reply all
Reply to author
Forward
0 new messages