使用tornado,我们可以做什么?
以下介绍都是建立在python2.x的基础上面,tornado使用任意版本皆可。
如果我们需要对外提供一个http server(web api)/websocket server时,我们都可以使用tornado,以下是一个基于tornado的rest的应用简介。
当我们下载好了tornado以后,可以按照tornado的文档demo,复制一份监听代码过来,代码如下:
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()
这一段代码在运行时就已经可以开始监听并返回信息了,然后开始按照rest的规范开始改写,我们首先需要对url的path进行定位,根据path执行相对应的代码,则有了以下代码:
import os.path
import tornado.escape
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.websocket
import tornado.httpserver
import tools
import applogic
from config import config class Application(tornado.web.Application):
def __init__(self):
handlers = [
(r"/.*?", WebHandler),
]
settings = dict(
cookie_secret="__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__",
template_path=os.path.join(os.path.dirname(__file__), "templates"),
static_path=os.path.join(os.path.dirname(__file__), "static"),
xsrf_cookies=False
)
tornado.web.Application.__init__(self, handlers, **settings) class WebHandler(tornado.web.RequestHandler):
def get(self):
path = self.request.path
command = path[path.rfind('/') +1:]
result = applogic.execute(self, command, self.get_argument)
if result:
to_message = tools.dumps(result)
self.write(to_message) def post(self):
path = self.request.path
command = path[path.rfind('/') +1:]
obj = tools.loads(self.request.body)
result = applogic.execute(self, command, obj)
if result:
to_message = tools.dumps(result)
self.write(to_message) def main():
app = Application()
http_server = tornado.httpserver.HTTPServer(app)
http_server.bind(config.default['main_port'], config.default['host'])
tornado.ioloop.IOLoop.instance().start()
我们对path做了最后一级目录的截取,由于客观原因,多级目录的则需要看客们自行实现。
applogic是我们的具体的逻辑代码门面类,因为是脚本语言的关系,所以这里使用一个相对巧妙的ioc,代码如下:
def execute(handler, command, obj):
if main_map.has_key(command):
result = main_map[command](handler, obj)
if result:
response.send(handler, result)
else:
handler.send_error(404) def create(handler, obj):
flag = papercache.push(obj)
result = {}
if flag:
result = {
'code':0
}
else:
result = {
'code':1,
'errorMsg':'param is error'
}
return result def grab(handler, obj):
id = obj.has_key('id') and obj['id'] or None
result = {
'code':1,
'errorMsg':'redpaper is empty',
'money':0
}
if id:
money = papercache.pop_queue(id)
if money:
result = {
'money' : money,
'code': 0
}
return result main_map = {
'create':create,
'grab':grab
}
我们将具体的执行逻辑,放在定义好的function里面,然后将function的引用放在一个字典里面,然后根据command(最后一级目录对应的字符串),来执行具体的代码。
我们将返回的数据做了一个封装,因为实际应用里面的数据格式,可能采用的是json,或者是其它自定义的协议,所以我们有一个response的封装,代码如下:
def send(handler, obj):
if type(handler) is not None:
obj = tools.dumps(obj)
handler.write(obj)
tools的代码如下:
import json def dumps(obj):
obj = toUnicode(obj)
if obj:
obj = json.dumps(obj)
obj = str(obj)
return obj def loads(obj):
if obj:
obj = json.loads(str(obj))
obj = toUtf8(obj)
return obj
因为可能存在中文的关系,所以加了一个Utf8的转换,,基于websocket的也是同理,则在监听的时候,使用WebSocketHandle,代码如下:
import os.path
import tornado.escape
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.websocket
import tornado.httpserver
import tools
import applogic
from config import config class Application(tornado.web.Application):
def __init__(self):
handlers = [
(r"/web", MainHandler)
(r"/.*?", WebHandler),
]
settings = dict(
cookie_secret="__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__",
template_path=os.path.join(os.path.dirname(__file__), "templates"),
static_path=os.path.join(os.path.dirname(__file__), "static"),
xsrf_cookies=False
)
tornado.web.Application.__init__(self, handlers, **settings) class MainHandler(tornado.websocket.WebSocketHandler):
def allow_draft76(self):
return True def open(self):
token = self.get_cookie('token')
if not token:
print "long not token"
self.close()
else:
print('connect') def on_close(self):
print('close'); def on_message(self, message):
obj = tools.loads(message)
command = obj.has_key('command') and obj['command'] or None
body = obj.has_key('body') and obj['body'] or None
result = applogic.execute(self, command, body)
if result:
to_message = tools.dumps(result)
self.write(to_message)
return class WebHandler(tornado.web.RequestHandler):
def get(self):
path = self.request.path
command = path[path.rfind('/') +1:]
result = applogic.execute(self, command, self.get_argument)
if result:
to_message = tools.dumps(result)
self.write(to_message) def post(self):
path = self.request.path
command = path[path.rfind('/') +1:]
obj = tools.loads(self.request.body)
result = applogic.execute(self, command, obj)
if result:
to_message = tools.dumps(result)
self.write(to_message) def main():
app = Application()
http_server = tornado.httpserver.HTTPServer(app)
http_server.bind(config.default['main_port'], config.default['host'])
tornado.ioloop.IOLoop.instance().start()
可能你们会觉得怎么多了个command和body出来了,因为我的通讯协议是假定{"command":"", "body":""},这样的json格式。
那一个简易的基于python的rest服务和websocket通讯服务器到这里就结束了
使用tornado,我们可以做什么?的更多相关文章
- Tornado基于MiddleWare做中间件
详细代码如下: 在app.py里添加 # -*- coding:utf-8 -*- from tornado.ioloop import IOLoop from tornado.web import ...
- 深入理解Tornado——一个异步web服务器
本人的第一次翻译,转载请注明出处:http://www.cnblogs.com/yiwenshengmei/archive/2011/06/08/understanding_tornado.html原 ...
- [tornado]websocket 最简单demo
想法 前两天想看看django 长轮询或者是websocket的方案,发现都不太好使. tornado很适合做这个工作,于是找了些资料,参照了做了个最简单demo,以便备用. 具体的概念就不说了,to ...
- tornado架构分析1 从helloworld分析tornado架构
最近公司需要我写一个高性能RESTful服务组件.我之前很少涉及这种高性能服务器架构,帮公司和平时没事玩都是写脚本级别的东西.虽然好多基础组件(sphinx.logging.configparse等) ...
- Python的Tornado框架的异步任务与AsyncHTTPClient
转载自http://www.php.cn/python-tutorials-284773.html 高性能服务器TornadoPython的web框架名目繁多,各有千秋.正如光荣属于希腊,伟大属于罗马 ...
- python的高性能web应用的开发与测试实验
python的高性能web应用的开发与测试实验 tornado“同步和异步”网络IO模型实验 引言 python语言一直以开发效率高著称,被广泛地应用于自动化领域: 测试自动化 运维自动化 构建发布自 ...
- 一个使用 asyncio 开发的网络爬虫(译文)
原文地址:https://www.aosabook.org/en/500L/a-web-crawler-with-asyncio-coroutines.html 作者简介 A. Jesse Jiryu ...
- tornado做简单socket服务器(TCP)
http://blog.csdn.net/chenggong2dm/article/details/9041181 服务器端代码如下: #! /usr/bin/env python #coding=u ...
- tornado框架学习及借用有道翻译api做自动翻译页面
趁着这几天有时间,就简单的学了一下tornado框架,简单做了个自动翻译的页面 仅为自己学习参考,不作其他用途 文件夹目录结构如下: . ├── server.py ├── static │ └─ ...
随机推荐
- Js 原型和原型链
Js中通过原型和原型链实现了继承 Js对象属性的访问,首先会查找自身是否拥有这个属性 如果查到,则返回属性值,如果找不到,就会遍历原型链,一层一层的查找,如果找到就会返回属性值 直到遍历完Object ...
- PHP赋值运算
1. 赋值运算:= ,意思是右边表达式的值赋给左边的运算数. $int1=10; $int1=$int1-6; //$int1=4 echo $int1,"<br>"; ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统 (源码购买说明)
系列目录 升级日志 !!!重大版本更新:于2016-12-20日完成了系统的结构重构并合并简化了T4(这是一次重要的更新,不需要修改现有功能的代码),代码总行数比上个版本又少了1/3.更新了代码生成器 ...
- FullCalendar日历插件说明文档
FullCalendar提供了丰富的属性设置和方法调用,开发者可以根据FullCalendar提供的API快速完成一个日历日程的开发,本文将FullCalendar的常用属性和方法.回调函数等整理成中 ...
- maven依赖查询地址
http://search.maven.org/#search%7Cga%7C1%7C
- Android Retrofit 2.0 使用-补充篇
推荐阅读,猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava 4.RxBus 5.Android MVP+Retrofit+RxJava实践小 ...
- Android开发学习—— Broadcast广播接收者
现实中:电台要发布消息,通过广播把消息广播出去,使用收音机,就可以收听广播,得知这条消息.Android中:系统在运行过程中,会产生许多事件,那么某些事件产生时,比如:电量改变.收发短信.拨打电话.屏 ...
- Maven安装
开发分布式的商场系统,用到了一些新的技术,做一个记录和分享 这里讲一下maven安装 首先什么是Maven Maven作为一个构建工具,不仅帮我们自动化构建,还能抽象构建过程,提供构建任务实现.他跨平 ...
- 多本地代码工作点更新到2个远端GIT仓库
摘要:本文介绍了笔者多个本地工作节点(地方)的多台电脑(PC/笔记本电脑)同步源码到2个远端的GIT(一个GITHUB国外强制公开,一个oschina国内可不公开). 作者:太初 转载说明:请指明原作 ...
- IIS8 使用FastCGI配置PHP环境支持 过程详解
平时帮朋友们配置过一些PHP环境的服务器,但是一直使用的都是Apache HTTP+PHP,今天呢,我吧IIS+PHP配置方式给大家发一下下~呵呵. 在这里,我使用的是FastCGI模块映射的方式配置 ...