python学习笔记:6 tornado

tornad是Facebook开源的非阻塞式web框架,类似于nodejs,主要是为了解决frendfeed的实时更新。因此相应速度非常高。

安装

win10环境:

1
pip install tornado

mongodb数据库:官网下载地址

数据库请求

Mysql

Tornado-MySQL,是对PyMySQL的异步化的一个库,测试用例,文档,都比较齐全,目前在使用的版本。

异步web请求

使用异步装饰器,实现异步功能

1
2
3
4
5
6
7
8
9
10
11
class TestAsynchr2(tornado.web.RequestHandler):
@tornado.web.asynchronous
@tornado.gen.engine
def get(self, *args, **kwargs):
client = tornado.httpclient.AsyncHTTPClient();
response = yield tornado.gen.Task(client.fetch,test_url)
body = json.loads(response.body)
print '异步请求2 %s' % body
print body['errNum']
self.write('异步请求2 %s' % response.body)
self.finish()

重点是yield,以及self.finish()

使用asyncmongo,来异步的调用mongoDB服务器。它是专门给Tornado开发者开发提供异步数据库访问的

使用tornado进行长轮询

传统的方案是浏览器js进行定时http轮训,但是对服务器压力太大了。
新的技术是让浏览器发起连接来模拟服务器推送更新。这种方式的HTTP连接被称为长轮询或Comet请求。意味着浏览器只需启动一个http请求,其连接的服务器会有意保持开启,浏览器只需要等待更新可用时服务器”推送”响应。当服务器发送响应并关闭连接后,(或者浏览器端客户请求超时),客户端只需打开一个新的连接并等待下一个更新。

好处:

  • 减少web服务器负载
  • 浏览器兼容性,只要支持ajax即可
  • 比如状态更新,消息通知,聊天消息,Twitter显示通知,Facebook的聊天
  • 跟websockets的实现方式不同

常见问题

修改mysql默认字符集

最简单的方法:修改mysql的my.ini配置文件.

1
2
default-character-set = utf8
character_set_server = utf8

python2.7查询mysql的中文乱码

解决方法:

1
2
3
4
5
6
7
8
9
10
reload(sys)
sys.setdefaultencoding('utf-8')

conn = yield tornado_mysql
.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='test',charset='utf8')

然后
print value.decode('utf-8')
如果是插入
则是value = unicode('你好',’utf-8')