tornado web 应用程序一般包含一个或者多个RequestHandler 子类,一个Application 对象来为每一个控制器路由到达的请求和一个mian()函数html
import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") def make_app(): return tornado.web.Application([ (r"/", MainHandler), ]) if __name__ == "__main__": app = make_app() app.listen(8888) tornado.ioloop.IOLoop.current().start()
Application 对象python
Application 对象是负责全局的设置,包括用来转发请求和控制器的路由表web
路由表是一些的url对象,其中包括正则,参数等,若是一个字典当作url被传递到第三个参数中时,它将做为初始参数传递给RequestHandler.initialize 最后url可能会有一个名字容许和RequestHandler.reverse_url 一块儿使用正则表达式
RequestHandler 子类json
大多数tornado.web 应用程序的工做都是在RequestHandler子类中完成的,对于一个控制器子类来讲主入口点被get()和post()等这个的HTTP方法控制着api
许多RequestHandler.render 或者RequestHandler.write 将会产生一个相应的render(),经过名字做为参数加载Template.write(),将产生一个不适用模本的纯输出,它接收字符串,字节系列和字典等app
许多RequestHandler中的方法被设计成为可以在子类中覆盖方法以在整个应用程序中使用,一般定义BaseHandler类来覆盖writ.error 和get_current_user 而后继承时,使用的是BaseHandler异步
处理输入请求async
处理输入请求能够用self.requestide
经过 HTML 表单形式的数据能够利用 get_query_argument
和 get_body_argument
等方法来转换
RequestHandler
能够明确的声明想要的是一个值仍是一个列表. 对于列表来讲, 使用 get_query_arguments
和 get_body_arguments
经过 self.request.files
能够实现文件上传
因为 HTML 的编码形式十分古怪 (例如. 不区分单一参数仍是列表参数), Tornado 不会试图去统一这些参数. 特别的, 咱们不会解析 JSON 请求的请求体. 应用程序但愿使用 JSON 在编码上代替prepare
来解析它们的请求:
def prepare(self): if self.request.headers["Content-Type"].startswith("application/json"): self.json_args = json.loads(self.request.body) else: self.json_args = None
initialize()
在 Application
的初始化配置参数下被调用. initialize
一般只保存成员变量传递的参数; 它将不会产生任何输出或者调用像 send_error
同样的方法.prepare()
被调用. 这时基类在与子类共享中最有用的一个方法, 不管是否使用了 HTTP 方法prepare
都将会被调用. prepare
可能会产生输出; 若是她调用了 finish
(或者 redirect
, 等等), 处理会在这终止.get()
, post()
, put()
, 等等. 若是 URL 正则表达式中包含匹配组, 它们将被传递当这些方法的参数中.on_finish()
. 对于同步处理来讲调用会在 get()
(等) 返回后当即执行; 对于异步处理来讲这将会发生在调用 finish()
以后.全部像这样能够被覆盖的方法都记录在 RequestHandler
的文档中. 其中一些最经常使用的覆盖方法有:
write_error
- 输出一个HTML的出错信息on_connection_close
- 当与客户端断开时会被调用; 应用程序将会检查这种状况而且中止后续的处理. 要注意这里没法保证客户端断开时能够马上被检测到.get_current_user
- 详见 用户认证get_user_locale
- 给当前用户返回一个 Locale
对象set_default_headers
- 能够用来设置 在回应时的附加首部 (例如能够定制 Server
首部)
在 Tornado 中重定向有两种重要的方式: RequestHandler.redirect
和利用 RedirectHandler
.
你能够在 RequestHandler
中使用 self.redirect()
把用户重定向到其它地方. 可选参数 permanent
能够定义这个跳转是否时永久的.
RedirectHandler
能够在你的 Application
路由表中直接设置跳转. 例如, 设置一条静态跳转:
app = tornado.web.Application([ url(r"/app", tornado.web.RedirectHandler, dict(url="http://itunes.apple.com/my-app-id")), ])
使用异步处理程序的最简单方式是使用 coroutine
修饰符. 这将会容许你经过关键字 yield
生成一个 非阻塞 I/O,
在某些时候, 协程可能不如一些基于回调的方式更方便, 在这些状况下 tornado.web.asynchronous
修饰符能够被取代. 这个修饰符一般不会自动发送应答; 相反请求将会被保持直到有些回调函数调用RequestHandler.finish
. 这取决于应用程序来保证方法是会被掉用的, 不然用户的请求将会被简单的挂起.
c
class MainHandler(tornado.web.RequestHandler): @tornado.web.asynchronous def get(self): http = tornado.httpclient.AsyncHTTPClient() http.fetch("http://friendfeed-api.com/v2/feed/bret", callback=self.on_response) def on_response(self, response): if response.error: raise tornado.web.HTTPError(500) json = tornado.escape.json_decode(response.body) self.write("Fetched " + str(len(json["entries"])) + " entries " "from the FriendFeed API") self.finish()
参考http://tornado-zh-cn.readthedocs.io/zh_CN/latest/guide/structure.html