再拾tornado

起因

2年前学了下 tornado,参看:[tornado 学习](tornado 学习.md)

因为当时工作没用到,就放下来了.

现在想自已做点东西,看了下,还是 tornado 对我的胃口.

web.py 倒是一直在用,可是作者离世了,而且我也想用下websocket

于是又开始学了.

资料

中文网站都有了. http://www.tornadoweb.cn/

安装

参看 python-pip

sudo yum install python-pip.noarch
sudo pip install tornado

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()

学习

http://www.tornadoweb.cn/documentation 具体自已看就可以了.

DB

因为我用 postgresql,默认的database是针对mysql的.看这里,可以试试momoko

url与class name的映射

web.py 有 auto_applicaiton,最方便的地方是可以实现 class name 和 url 的自动映射,不用再傻傻的自已写 url 对应哪个class

可是 tornado 看上去是没这个功能了.可以试试自已来实现:

#!/usr/bin/env python
* -*- coding: utf-8 -*-
import tornado


def getURLMap(the_globals):
    url_map = []
    for i in the_globals:
        try:
            if issubclass(the_globals![pic](i), tornado.web.RequestHandler):
                url_map.append((r'/' + i, the_globals![pic](i)))
        except TypeError:
            continue
    return url_map

在外面把 the_globals = globals().copy() 传入来就可以了:

#!/usr/bin/env python
* -*- coding: utf-8 -*-
import tornado.ioloop
import tornado.web
import public


class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

the_globals = globals().copy()
url_map = public.getURLMap(the_globals)
application = tornado.web.Application(url_map)

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

static

和web.py一样,url设死了 /static访问的是靜态文件.

得在 settings 中设路径.

settings = {
    "static_path": "../"
}

application = tornado.web.Application(url_map, **settings)

json

web.py 的json要指定 heard

web.header('Content-Type', 'application/json;charset=UTF-8')

tornado 直接用?

self.write(json.dumps({"sum":s}))

在浏览器上查看,还是以text/html送过去的.看来tornado没法自动识别.

tornado 的文档没 web.py 的好,google了半天,找到了设的地方.

self.set_header("Content-Type", "application/json")

websocket

以后再看

问题

  • [tornado 改了代码后自动 reload](tornado 改了代码后自动 reload.md)
  • [tornado 一次取所有参数](tornado 一次取所有参数.md)
  • [tornado RESTful 取不到参数](tornado RESTful 取不到参数.md)