了解 Tornado 应用程序中的信息流
Understanding Information Flow in Tornado App
我正在自学 Tornado,所以我买了一份 Introduction to Tornado,并开始研究示例。我正在使用第三个,它可以工作,但我不明白 how/why。
以下是书中代码的修改版本,但功能等效。我有一个名为 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
?
基本上,在您的示例中,您已经使用 tornado 设置了 RESTful 服务。
在 HTML 表单中,您有 specify,在 method="post"
中,在提交表单时,您将以 HTTP post 请求的形式发送字段中的数据。此外,通过使用 action="/poem"
,您可以指定在提交表单时将 form-data 发送到何处。
点击提交后,您会向 tornado 网络服务器发送一个 HTTP post 请求。当你的 Tornado 服务器收到请求时,Tornado 遍历 handlers
列表并创建 tornado.web.RequestHandler
子类的实例,PoemPageHandler
,它与正则表达式 "/poem"
相关联在表单中定义为action,然后调用post()方法。
post() 方法的最后一个命令是 render: self.render('poem.html', mary=name, lamb=noun1, snow=noun2, go=verb)
,它使用传递的参数呈现模板 poem.html
并将您重定向到 http://localhost:8000/poem
.
我正在自学 Tornado,所以我买了一份 Introduction to Tornado,并开始研究示例。我正在使用第三个,它可以工作,但我不明白 how/why。
以下是书中代码的修改版本,但功能等效。我有一个名为 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
?
基本上,在您的示例中,您已经使用 tornado 设置了 RESTful 服务。
在 HTML 表单中,您有 specify,在 method="post"
中,在提交表单时,您将以 HTTP post 请求的形式发送字段中的数据。此外,通过使用 action="/poem"
,您可以指定在提交表单时将 form-data 发送到何处。
点击提交后,您会向 tornado 网络服务器发送一个 HTTP post 请求。当你的 Tornado 服务器收到请求时,Tornado 遍历 handlers
列表并创建 tornado.web.RequestHandler
子类的实例,PoemPageHandler
,它与正则表达式 "/poem"
相关联在表单中定义为action,然后调用post()方法。
post() 方法的最后一个命令是 render: self.render('poem.html', mary=name, lamb=noun1, snow=noun2, go=verb)
,它使用传递的参数呈现模板 poem.html
并将您重定向到 http://localhost:8000/poem
.