SQLAlchemy Model 实例数据转 Dict 数据结构

在最近的移动端后台项目里, 基于 SQLAlchemy 这个组件封装了自己的业务模块,
也是第一次对 Python Web 开发 Model 有一个初步的印象和理解. 基于它做
业务开发, 使用中需要有将实例数据转换为 Python Dict 的操作(或者是序列化为
Json 数据, 返回给客户端接口). 简单的做法是, 对具体的每个业务 Model 定义了
Column 之后, 定义成员函数 def to_dict(self), 根据具体 Model 的数据属性
来写对应的转换方式, 工作量相对繁琐, 是否有更合适的方式实现, 且少写代码, 也就
开始实践和寻找更好的实现的方式.

本文提供四种实现方式, 方案1, 2 为 stackoverflow 提供的解答,
方案3,4 是我在项目中先后使用的方案(代码基于 Python3实现).
方案4为推荐实现, 并且分别提供原生的SQLAlchemy 和 Flask-SQLAlchemy BaseModel 实现例子:)

Continue reading

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

Python gevent + zmq + redis 搭配小实践

前些日子与 darkforday 交流时听说了 Python 中
基于 libev 封装的 gevent 库, 编码和性能上也是值得关注的.

简单介绍下 gevent (来自 tutorial ):

gevent is a concurrency library based around libev.
It provides a clean API for a variety of concurrency
and network related tasks.

翻译即:
gevent 是一个基于 libev的并发库, 提供了大量清楚简洁的并发和网络
相关任务的API

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