Tornado底层学习 (1) — tornado ioloop start 的过程

写在分享前:
基于 tornado 开发 http 服务已经 3个月了, 通过 F2E.im 项目模仿, 也开始重新
重写整个业务代码(现成的开源代码并不适用复杂的使用场景, 数据库和缓存的
模块就需要使用新的模块组件), 在这个过渡阶段中, 也遇到诸如
tornado-restful 封装的库在 tornado.gen.coroutine 搭配并不成功的坑, 因此
有必要在使用第三方开源库时, 理解 tornado 底层的代码, 以便修改第三方源码
或者做代码结构调整, 合理开发. 在 Write Less, Do More 之前, 学会
Read and Appreciate Other’s work.

每一个 tornado 应用都会把 tornado ioloop 导入到代码中, 通过 ioloop 事件触发
机制, 处理 http request, 或者其他的协议的连接消息. tornado 在 Linux 系统中优先
使用 epoll 的封装, 基于 epoll 做事件处理.

Continue reading

Tornado web.authenticated 用户认证浅析

在Web服务中会有用户登录后的一系列操作, 如果一个客户端的http
请求要求是用户登录后才能做得操作, 那么 Web服务器接收请求时
需要判断该请求里带的数据是否有用户认证的信息.

使用 Tornado 框架开发Web服务, 框架里提供了tornado.web.authenticated
的 decorator 的辅助开发者做用户登录认证, 即开发者在实现一个 handler
(对应一个url资源, 继承于tornado.web.RequestHandler)时,
该 url的资源操作需要有用户认证或者登录为前提, 那么在资源请求的方法
覆写时(overwritten), 例如在 get 与 post 方法定义前以
tornado.web.authenticated 装饰,并且同时覆写 get_current_user
方法(RequestHandler只是定义空函数, 默认放回None). 在覆写之后,
RequestHandler 类的实例里 current_user 就会有值. current_user
在 tornado源码中是 getter setter的实现, 真正的成员变量是 _current_user
(稍后解析tornado里的源码). authenticated 即实现了 current_user 判断
这一过程来验证用户.

Continue reading

tornado.gen.coroutine 使用初识

准备使用 tornado 4.0 开发业务服务.
目前有一个场景, 即客户端发送一个 auth post请求过来, 但服务器属于边缘节点,
需要把 auth 转发到真正的后台服务器.
此时有两种方式发送:
1. 边缘节点在接收到 post 请求, 然后调用 tornado.httpclient.HTTPClient()
同步获得结果 response
2. 异步方式操作, 不影响其他用户的请求(即不阻塞进程)
在阅读 tornado demo 的 authdemo.py 源码时 有一个 @gen.coroutine 使用
于是查阅相关资料, 并做了代码验证.

Continue reading