以下是经典的 “Hello, world” 示例:
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
application = tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
请求处理程序和请求参数
Tornado 的 Web 程序会将 URL 或者 URL 范式映射到 tornado.web.RequestHandler 的子类上去。在其子类中定义了get() 或 post() 方法,用以处理不同的 HTTP 请求。
下面的代码将 URL 根目录 / 映射到 MainHandler,还将一个 URL 范式 /story/([0-9]+) 映射到 StoryHandler。正则表达式匹配的分组会作为参数引入 的相应方法中:
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("You requested the main page")
class StoryHandler(tornado.web.RequestHandler):
def get(self, story_id):
self.write("You requested the story " + story_id)
application = tornado.web.Application([
(r"/", MainHandler),
(r"/story/([0-9]+)", StoryHandler),
])
你可以使用 get_argument() 方法来获取查询字符串参数,以及解析 POST 的内容:
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write('
' '' ''
'
') def post(self): self.set_header("Content-Type", "text/plain")
self.write("You wrote " + self.get_argument("message"))
上传的文件可以通过 self.request.files 访问到,该对象将名称(HTML元素 的
name 属性)对应到一个文件列表。每一个文件都以字典的形式
存在,其格式为 {"filename":...,
"content_type":..., "body":...}。
如果你想要返回一个错误信息给客户端,例如“403
unauthorized”,只需要抛出一个 tornado.web.HTTPError 异常:
if not self.user_is_logged_in():
raise tornado.web.HTTPError(403)
请求处理程序可以通过 self.request 访问到代表当前请求的对象。该 HTTPRequest 对象包含了一些有用的属性,包括:
arguments -
所有的 GET 或 POST 的参数
files -
所有通过 multipart/form-data POST
请求上传的文件
path -
请求的路径( ? 之前的所有内容)
headers -
请求的开头信息
模板
你可以在 Tornado 中使用任何一种 Python 支持的模板语言。但是相较于其它模板而言, Tornado
自带的模板系统速度更快,并且也更灵活。具体可以查看
Tornado 模板其实就是 HTML 文件(也可以是任何文本格式的文件),其中包含了 Python
控制结构和表达式,这些控制结构和表达式需要放在规定的格式标记符(markup)中:
{{ escape(item) }}
{% end %}
如果你把上面的代码命名为 "template.html",保存在 Python 代码的同一目录中,你就可以 这样来渲染它:
class MainHandler(tornado.web.RequestHandler):
def get(self):
items = ["Item 1", "Item 2", "Item 3"]
self.render("template.html", title="My title", items=items)
Tornado 的模板支持“控制语句”和“表达语句”,控制语句是使用 {% 和 %} 包起来的
例如 {% if
len(items) > 2 %}。表达语句是使用 {{ 和 }} 包起来的,例如 {{
items[0] }}。
控制语句和对应的 Python 语句的格式基本完全相同。我们支持 if、for、while 和 try,这些语句逻辑结束的位置需要用 {%
end
%} 做标记。我们还通过 extends 和 block 语句实现了模板继承。这些在 template 模块 的代码文档中有着详细的描述。