SAE的Tornado开发经验

对程序员来说,新浪云SAE无疑是国内最好的PaaS平台,实名认证和绑定移动端得到的免费云豆,可以让你在做出一款能抬起头的应用之前不愁吃喝。
所以这一年里做过的网站和应用,第一个版本都是起于SAE。
对于Python的网络框架,小2原本专攻大路货Django,工作中被一高手点醒后,开始迷醉于Tornado的快。对,并不是非阻塞的快,而且开发的快,极适合做前后端分离、以JSON传递数据的模式。
人老怕忘,随手记记Tornado在SAE上的坑。

ORM的选择

sqlalchemy既不简洁又缺乏一致性,但建表、重连、SQL包装、连接池这些dirty job总得有人做。sqlalchemy的使用必须注意以下问题:

连接的创建和关闭

因为SAE的MySQL超时时间设置得很短(10秒左右),因此在网络连接关闭的时候必须同时关闭数据库连接。最好的办法是都继承一个BaseHandler。

1
2
3
4
5
6
class BaseHandler(tornado.web.RequestHandler):
def initialize(self):
self.session = DB_Session()

def on_finish(self):
self.session.close()

缩短重连时间

因为超时时间比MySQL的通用配置要短,所以sqlalchemy的重连时间也必须同步,否则会报「MySQL has gone away」的2006数据库错误。我的配置仅供参考:

1
engine = create_engine(db_config, pool_recycle=5, poolclass=NullPool)

一般都会选择Tornado的secure_cookie作为账号的惟一凭证,上线必须找一个不改变(重新部署后之前的cookie不失效)也不容易让外人得知的字符串做密钥。我应用的secret_key:

1
cookie_secret = 'test' if debug else sae.const.SECRET_KEY

日志

SAE的logging默认级别是warning,所以logging.info(‘’)是不会生效的,最好在入口处设置:

1
logging.basicConfig(level=logging.INFO)

余不一一,GitHub传送门:SAETornado