本文发自 http://www.binss.me/blog/record-of-learning-tornado-1/,转载请注明出处。

由于新的项目可能对性能要求比较高,考虑到Django比较重,打算采用比较轻量级的Tornado,在此记录下学习心得:

Talk is cheap,先看以下示例代码:

# -- encoding: utf-8 --
import os.path
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import logging
from tornado.options import define, options

define("port", default=8000, help="run on the given port", type=int)
define("bind", default="127.0.0.1", help="addrs bind to")
define("debug", default=False, help="debug mode")

# 处理请求
class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        greeting = self.get_argument('greeting', 'Hello')
        self.write(greeting + ', friendly user!')

# 重载Application类
class Application(tornado.web.Application):
    def init(self):
        handlers = [
            (r"/", IndexHandler),
        ]
        settings = dict(
            template_path=os.path.join(os.path.dirname(file), "templates"),
            static_path=os.path.join(os.path.dirname(file), "static"),
            debug=True,
        )
        tornado.web.Application.init(self, handlers, **settings)

if name == "main":
    tornado.options.parse_command_line()
    http_server = tornado.httpserver.HTTPServer(Application())
    # 设置ip和监听端口
    http_server.bind(options.port, options.bind)
    http_server.start()

    if options.debug:
        logging.getLogger().setLevel(logging.DEBUG)
    logging.info("http server started on %s:%s" % (options.bind, options.port))

    tornado.ioloop.IOLoop.instance().start()

这是Tornado最基本的实例。

define("port", default=8000, help="run on the given port", type=int)
define("bind", default="127.0.0.1", help="addrs bind to")
define("debug", default=True, help="debug mode")

设定了tornado.options中服务端端口,IP和模式。 然后通过bind()绑定。

这样设置的话,利用python test.py运行服务端后,在浏览器用http://127.0.0.1:8000/可以访问网站。

(r"/", IndexHandler)http://127.0.0.1:8000/指定了处理者,当你访问该url时,服务端会调用IndexHandler来处理请求:

get()指的是其只处理get请求,同理用post()可以处理post请求。

在这两个函数中,可以通过get_argument来获取请求中的参数,get_argument的第一个参数为参数名,第二个为默认值。如:http://127.0.0.1:8000/?greeting=dudu则变量greeting的值为dudu,最终返回dudu, friendly user!。如果没有参数,则greeting被设置为默认值Hello,返回Hello, friendly user!

一个tornado httpserver需要指定一个application来作为其参数。虽然可以使用:

app = tornado.web.Application(
    handlers=[
        (r"/", IndexHandler),
    ],
    ......
)

来构造出app实例,但是更推荐用示例中直接重载application类,因为这样做更加直观,便于修改。

在实例代码重载的Application类中,我们为url指定了handler,指定了模版(template)和静态文件(static)的路径(下一篇文章会讲),且设置为debug模式。当处于debug模式时,一旦主要的Python文件被修改,Tornado将会尝试重启服务器,并且在模板改变时会进行刷新。大大方便了调试过程。

理解了这些,我们就可以方便地进行新页面扩展:

  1. 添加handler。

  2. 在application的handlers中加入元组(url,handler)。

下一篇讲模版/模块。