tornado web应用程序结构

tornado web 应用程序通常包含一个或者多个RequestHandler 子类,一个Application 对象来为每个控制器路由到达的请求和一个mian()函数

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 对象

Application 对象是负责全局的设置,包括用来转发请求和控制器的路由表

路由表是一些的url对象,其中包括正则,参数等,如果一个字典当做url被传递到第三个参数中时,它将作为初始参数传递给RequestHandler.initialize 最后url可能会有一个名字允许和RequestHandler.reverse_url 一起使用

  

RequestHandler 子类

大多数tornado.web 应用程序的工作都是在RequestHandler子类中完成的,对于一个控制器子类来说主入口点被get()和post()等这个的HTTP方法控制着

许多RequestHandler.render 或者RequestHandler.write 将会产生一个相应的render(),通过名字作为参数加载Template.write(),将产生一个不适用模本的纯输出,它接收字符串,字节系列和字典等

许多RequestHandler中的方法被设计成为能够在子类中覆盖方法以在整个应用程序中使用,通常定义BaseHandler类来覆盖writ.error  和get_current_user 然后继承时,使用的是BaseHandler

处理输入请求

处理输入请求可以用self.request

通过 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

覆盖 RequestHandler 的方法

  

  1. initialize() 在 Application 的初始化配置参数下被调用. initialize 通常只保存成员变量传递的参数; 它将不会产生任何输出或者调用像 send_error 一样的方法.
  2. prepare() 被调用. 这时基类在与子类共享中最有用的一个方法, 不论是否使用了 HTTP 方法prepare 都将会被调用. prepare 可能会产生输出; 如果她调用了 finish (或者 redirect, 等等), 处理会在这终止.
  3. HTTP方法将会被调用: get()post()put(), 等等. 如果 URL 正则表达式中包含匹配组, 它们将被传递当这些方法的参数中.
  4. 当这些请求结束以后, 会调用 on_finish() . 对于同步处理来说调用会在 get() (等) 返回后立即执行; 对于异步处理来说这将会发生在调用 finish() 之后.

所有像这样可以被覆盖的方法都记录在 RequestHandler 的文档中. 其中一些最常用的覆盖方法有:

重定向

  

在 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

原文地址:https://www.cnblogs.com/1204guo/p/8533916.html