1

如有乱码或效果不佳,请移步(https://www.zybuluo.com/bornkiller/note/22680

模块加载

用于构建HTTP服务器,主要依赖于两个模块:

  • tornado.web
  • tornado.ioloop

Tornado构建HTTP服务器

因为从Nodejs切到Python,所以习惯上难以适应。先来看Nodejs(express)构建方式:

/**
 * Created by Administrator on 14-2-14.
 */
var express =require('express');
var app = express();
app.all('*',express.json());
app.get('/therapy',therapyQueryRespond);
app.get('/therapy/:Game_ID',particularTherapyQueryRespond);
app.post('/therapy/:Therapy_ID',therapyUpdateRespond);
app.put('/therapy',therapyCreateCheck,therapyCreateRespond);
app.del('/therapy/:Therapy_ID',therapyRemoveRespond);
app.use(express.static(__dirname + '/public'));
app.listen(1336);

结构比较清楚,中间件->路由映射,路由对应的为函数,最后由listen方法启动监听HTTP端口。
然后再来看一下Python(tornado)的实现方式:

  1. 定义路由处理类
class LoverHandler(tornado.web.RequestHandler) :
    def initialize(self) :
        pass
    def prepare(self):
        pass
    def get(self) :
        pass
    def post(self):
        pass
    def put(self) :
        pass
    def delete(self) :
        pass
    def on_finish(self):
        pass

这是一个比较完整的业务逻辑类,对同一路径,根据需求可以处理不同请求方法,还有其他可重写方法暂时不涉及。对prepare方法,感觉像是nodejs中的路径中间件,在请求到达业务层之前对请求做预处理。

  1. 路由映射
app = tornado.web.Application([
    (r"/",LoverHandler),
], **setting)

Application类初始化需要两个参数,第一个是所谓的urlspec元组,此前没接触过Python的人表示不懂,即路由映射。第二个参数是对某些预定义类及方法的参数配置。单一映射第一个参数为正则表达式,第二个为路径Handler类,可以传递第三个参数给Handler类的initialize方法。
3. 服务启动

app.listen(8888)
tornado.ioloop.IOLoop.current().start()

到此为止, tornado搭建HTTP服务器的结构初步完成。

模板渲染

模板渲染主要依托Tornado.RequestHandler.render方法来完成,具体文档(http://www.tornadoweb.org/en/stable/guide/templates.html)。

environment = {
    "title" : "Pretty love story",
}
def get(self) :
    self.chartset = "UTF-8"
    self.render('index.html',**environment)
<!doctype html>
<html lang="en">
<head>
    <meta charset="{{ handler.charset }}">
    <title>{{ title }}</title>
</head>
<body>
</body>
</html>

此处模板变量传入有两种方式,请注意使用时的差异。

完整代码示例

__author__ = 'Administrator'

import tornado.ioloop
import tornado.web
import tornado.escape
import os

environment = {
    "lang" : "en",
    "charset" : "UTF-8",
    "title" : "Pretty love story",
    "static_link_prefix" : "/static"
}

class LoverHandler(tornado.web.RequestHandler) :
    def initialize(self) :
        pass
    def prepare(self):
        pass
    def get(self) :
        self.link_scripts = (
            "bower_components/jquery/dist/jquery.js",
        )
        self.link_css = ()
        self.render('index.html',**environment)
    def post(self):
        self.write('500 days with summer')
    def put(self) :
        self.write('the dark knight')
    def delete(self) :
        self.write('no room for the old')
    def on_finish(self):
        pass

setting = {
    "static_path" : os.path.join(os.path.dirname(__file__),"static"),
    "template_path" : os.path.join(os.path.dirname(__file__),"template")
}

app = tornado.web.Application([
    (r"/",LoverHandler),
    (r"/static\/(.+)",tornado.web.StaticFileHandler),
], **setting)

def main() :
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

if __name__ == '__main__' :
    main()

TO-DO List

  • AMD (asynchronous module define)
  • Linux shell
  • HTTP protocol
  • SSH protocol

怀疑真爱的流浪者jason
923 声望62 粉丝

For every single second in life, I want to fight with the monster deep within my heart , and I want to win.........


引用和评论

0 条评论