是否可以在Tornado中基于模板变量运行javascript代码?

时间:2012-10-17 18:46:58

标签: python tornado

如果处理程序返回变量以及模板:

self.render('page.html', enabled=enabled)

其中enabled是一个布尔变量。

到目前为止,我知道我可以做以下事情:

{% if enabled %}
    ...
{% end %}

在模板的HTML部分内。

但是我们可以根据Tornado模板中的这个enabled变量有条件地运行一些javascript代码吗?换句话说,我们可以在模板中嵌入的javascript中访问此变量的值吗?

1 个答案:

答案 0 :(得分:6)

当然 - 只有当{% if ... %}表达式为True时,{ % end %}if指令之间的模板中的任何内容才会被发送到浏览器。所以,其中的任何内容,无论是带有内联javascript的<script >标记,还是从某个位置导入javascript文件的<link>标记,只会在这种情况下通过网络传输。

您甚至可以在Javascript代码本身中放置模板iffor指令,以根据服务器代码已知的条件启用或禁用部分代码。这个,无限嵌入或不是整块代码,我认为不会被视为一个好的实践 - 因为它会以不合需要的方式纠缠代码的服务器和客户端。

要从javascript访问变量,只需执行:

    var enabled = {{enabled}};

使用服务器变量呈现{{...}}标记内的值。

在这种情况下,为了确保enabled中的值在Python和Javascript之间兼容,您应该使用数字0表示False,使用1表示True(因为如果使用Python布尔值,模板将呈现为 var enabled = True; - 这不是javascript所期望的,因为保留的&#34; true&#34;在Javascript中是小写的)

唯一的限制是您只能在将页面发送到浏览器之前设置服务器端变量。因此,如果您需要在服务器端设置任何取决于用户在所显示页面上的操作的变量,这种做法不会再削减它(仅限页面重新加载)。使页面在没有重新加载的情况下进行交互式更新的方法是依赖来自javascript的异步通信(以前专门称为&#34; ajax&#34;)。

编辑 - O.P进一步询问:

  

这是一个问题:当我返回一个字符串变量如   MYVAR =&#39; FOO杆&#39;到模板,以及何时评估此{{myvar}}   在JS代码中,JS显然将foo-bar解释为变量名   而不是一个字符串。在这种情况下,它会导致错误,因为 -   表示减法。如何让JS将foo-bar识别为字符串   值?

同样,正在发生的事情非常简单:{{ <expr> }}模板运算符会插入 rsulting表达式的字符串表示 - 所以如果你有python myvar = "bla"以及模板var myvar = {{ myvar }},以var myvar = bla呈现(并以这种方式发送到客户端浏览器) - bla附近没有引号 - 这就是为什么javascript将其视为变量名称。这方面的解决方法是在变量周围添加额外的引号,如果它是一个字符串,可以在Python端或模板上。

在模板上,您可以执行以下操作: var myvar="{{ myvar }}" - 或者,在Python方面,定义myvar时:myvar = '"%s"' % "bla"