Tornado是一个Python Web框架和异步网络库,最初由FriendFeed开发。通过使用非阻塞网络I / O,Tornado可以扩展到成千上万的开放连接,使其非常适合长时间polling、Socket和其他需要与每个用户建立长期连接的应用程序。
1、Tornado核心
(1)tornado.web:tornado的基础web框架
RequestHandler:封装对请求处理的所有信息和处理方法
get/post/..:封装对应的请求方式
write():封装响应信息,写响应信息的一个方法
(2)tornado.ioloop:核心io循环模块, tornado高性能处理的核心。
current()返回当前线程的IOLoop实例对象
start()启动IOLoop实力对象的IO循环,开启监听
(3)tornado.web.Application:组成Web应用程序的请求处理程序的集合。此类的实例是可调用的,可以直接传递给HTTPServer来为应用程序提供服务。
(4)tornado.gen 基于生成器的协程。
这个是需要在RequestHandler的各类请求中使用gen.coroutine修饰器,然后里面通过yield生成器来执行请求以得到异步返回。客户端一般使用非阻塞HTTP客户端,在tornado中提供了这样的客户端,如tornado.httpclient.AsyncHTTPClient。
总体来说:
Python2:
@coroutine
def post(self):
data = tornado.escape.utf8(self.request.body)
logger.info('Data is %s' % data)
data = json.loads(data)
response = yield async_send_post(data)
Python3:(建议使用,async,await为Python3.5版本后自带的关键字,但也可使用@coroutine)
class CoroutineSleepHandler(RequestHandler):
async def get(self):
for i in range(5):
print(i)
await gen.sleep(1)
2、Tornado工程使用流程图
![c38506f10b763c5501afa15bbe1b1162.png](https://i-blog.csdnimg.cn/blog_migrate/360ef5b8bf9588ea7e6460104da182db.jpeg)
3、常见的搭配库
motor
Motor提供了一个基于协程的API,用于从Tornado或asyncio无阻塞访问MongoDB 。
pymongo
PyMongo是一个Python发行版,其中包含用于MongoDB的工具 ,并且是从Python使用MongoDB的推荐方式。
tormysql
提出了基于Future的API和Greenlet,用于对MySQL的非阻塞访问。
psycopg2
是Python语言的PostgreSQL数据库接口
SqlAlchemy:python ORM框架
ORM,对象关系映射,即Object Relational Mapping的简称,通过ORM框架将编程语言中的对象模型与数据库的关系模型建立映射关系,这样做的目的:简化sql语言操作数据库的繁琐过程(原生sql的编写及拼接等),转而直接使用对象模型来操作数据库做替代。
cx_Oracle
连接oracle数据库使用的第三方库文件cx_Oracle
4、工程使用
(1)建立handlers
handlers = [(r"/zhihuwenda/v1.0/user/numbers", StudentCardHandler), # XXX接口
(r"/zhihuwenda/v2.0/user/numbers", StudentCardHandlerV2), # XXX接口
(r"/zhihuwenda/v1.0/user/set_study_time", SetStudyTimeHandler), # XXX接口
(r"/zhihuwenda/v1.0/user/get_location", GetLocationHandler), # XXX接口
(r"/zhihuwenda/v1.0/user/fence_create", FenceCreateHandler), # XXX接口
(r"/zhihuwenda/v1.0/user/fence_delete", FenceDeleteHandler), # XXX接口
(r"/zhihuwenda/v1.0/user/fence_search", FenceSearchHandler) # XXX接口]
(2)各类数据库的交互
(3)部署
def main():
app = make_app()
app.listen(8888)
IOLoop.current().start()
if __name__ == '__main__':
main()