了解Tornado App中的信息流

时间:2017-02-11 00:18:09

标签: python web-applications tornado

我自己教龙卷风,所以我买了Introduction to Tornado的副本,并开始研究这些例子。我是第三个,它有效,但我不明白如何/为什么。

以下是本书中代码的修改版但功能相同的版本。我有一个名为poemaker.py的文件

import os.path
import tornado.web
from tornado.options import define, options


define("port", default=8000, help="run on the given port", type=int)


class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        self.render('index.html')


class PoemPageHandler(tornado.web.RequestHandler):
    def post(self):
        name = self.get_argument('name')
        noun1 = self.get_argument('noun1')
        noun2 = self.get_argument('noun2')
        verb = self.get_argument('verb')
        self.render('poem.html', mary=name, lamb=noun1, snow=noun2,
                    go=verb)


if __name__ == '__main__':
    import tornado.httpserver
    import tornado.ioloop
    import tornado.options

    tornado.options.parse_command_line()
    app = tornado.web.Application(
    handlers=[(r'/', IndexHandler), (r'/poem', PoemPageHandler)],
    template_path=os.path.join(os.path.dirname(__file__), "templates")
    )

    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

然后在同一目录中,我有另一个名为templates的目录,它有两个html文件:index.html和poem.hmtl。

的index.html:

<!DOCTYPE html>
    <html>
    <head><title>Poem Maker Pro</title></head>
    <body>
        <h1>Enter terms below.</h1>
        <form method="post" action="/poem">
            <p>Name<br><input type="text" name="name"></p>
            <p>Singular noun<br><input type="text" name="noun1"></p>
            <p>Singualr noun<br><input type="text" name="noun2"></p>
            <p>Verb w/o object<br><input type="text" name="verb"></p>
            <input type="submit">
    </form>
    </body>
</html>

当我启动服务器并转到http://localhost:8000/时,我看到index.html的内容已呈现。这正是我所期望的,因为那是IndexHandler应该做的事情。

当我填写表格并点击提交时,我会被带到http://localhost:8000/poem,这是我的诗。所以应用程序可以运行。

我不明白的是中间的一步。点击提交时会发生什么?应用程序如何知道提交表单我应该http://localhost:8000/poem

1 个答案:

答案 0 :(得分:1)

基本上,在您的示例中,您已使用龙卷风设置了RESTful服务。

在HTML表单上,specifymethod="post"一致,在提交表单时,您将在字段中将数据作为HTTP post请求发送。另外,使用action="/poem"指定提交表单时发送表单数据的位置。

当您点击提交时,您会向您的龙卷风网络服务器发送HTTP帖子请求。当您的Tornado服务器收到请求时,Tornado会遍历handlers列表并创建tornado.web.RequestHandler子类PoemPageHandler的实例,该实例与正则表达式"/poem"相关联。在表单中定义为action,然后调用post()方法。

post()方法的最后一个命令是renderself.render('poem.html', mary=name, lamb=noun1, snow=noun2, go=verb),它会使模板poem.html传递参数并将您重定向到http://localhost:8000/poem