如有乱码或效果不佳,请移步(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)的实现方式:
- 定义路由处理类
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
中的路径中间件,在请求到达业务层之前对请求做预处理。
- 路由映射
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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。