本文发自 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将会尝试重启服务器,并且在模板改变时会进行刷新。大大方便了调试过程。
理解了这些,我们就可以方便地进行新页面扩展:
-
添加handler。
-
在application的handlers中加入元组(url,handler)。
下一篇讲模版/模块。