python tornado json渲染到html脚本

spr*_*dej 1 html javascript python json tornado

我想将 json 文件呈现为 html 脚本部分。在龙卷风部分,No1 正在将 json 数据发送到 html。并且,No2 部分接收来自 No1 的 json 数据。但是,此代码不起作用。我发现 html 脚本不允许 {{ }} 的形式。我如何将 json 数据发送到 html 的一部分?

[python-龙卷风部分]

import tornado.web
import tornado.httpserver
import tornado.ioloop
import os.path
from tornado.options import define, options
define("port", default=3000, help="run on the given port", type=int)

class Application(tornado.web.Application):
    def __init__(self):
        base_dir = os.path.dirname(__file__)
        settings = {
        }
        tornado.web.Application.__init__(self, [
            tornado.web.url(r"/", MainHandler, name="main"),
        ], **settings)

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        data = {"name":"John Johnson","street":"Oslo West 16","phone":"555 1234567"}

        self.render("index.html", data=data)                        #No1

def main():
    tornado.options.parse_command_line()
    Application().listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

[html部分]

<!DOCTYPE html>
<html>
<body>
<h2>JSON Object Creation in JavaScript</h2>
<p id="demo"></p>
<script>
/* var text = '{"name":"John Johnson","street":"Oslo West 16","phone":"555 1234567"}'; */

var text = '{{data}}';                                          /*No2*/
var obj = JSON.parse(text);

document.getElementById("demo").innerHTML =
obj.name + "<br>" +
obj.street + "<br>" +
obj.phone;
</script>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

clo*_*her 5

index.html 模板中的 {{ }} 将自动转义为 html。您需要原始输出,因为在这种情况下您输出的是 javascript 而不是 html。您还想确保您确实让 python 将您的数据对象转换为格式正确的 json。

导入 json 库并添加对 json.dumps 的调用以获取格式正确的 JSON:

import tornado.web
import tornado.httpserver
import tornado.ioloop
import os.path
import json

from tornado.options import define, options
define("port", default=3000, help="run on the given port", type=int)

class Application(tornado.web.Application):
    def __init__(self):
        base_dir = os.path.dirname(__file__)
        settings = {
        }
        tornado.web.Application.__init__(self, [
            tornado.web.url(r"/", MainHandler, name="main"),
        ], **settings)

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        data = {"name":"John Johnson","street":"Oslo West 16","phone":"555 1234567"}

        self.render("index.html", data=json.dumps(data))

def main():
    tornado.options.parse_command_line()
    Application().listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

并使用 raw 来防止模板中的 html 自动转义输出:

<!DOCTYPE html>
<html>
<body>
<h2>JSON Object Creation in JavaScript</h2>
<p id="demo"></p>
<script>
/* var text = '{"name":"John Johnson","street":"Oslo West 16","phone":"555 1234567"}'; */

var text = '{% raw data %}';
var obj = JSON.parse(text);

document.getElementById("demo").innerHTML =
obj.name + "<br>" +
obj.street + "<br>" +
obj.phone;
</script>
<body>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)