周末终于有时间推一下这个东西.
web端基本的结构搭起来了.
使用python开发, 一是比较熟, 二是开发快.
db用的是mysql. orm用的sqlalchemy, mapper的高级特性基本没有使用.
框架是flask, 每个模块定义一个blueprint. 模板用的jinja2, 文件集中放在一起, 使用它的继承和include机制拆成若干小文件.
session使用的flask-session扩展包, 它使用了py2.7中的一个新特性(datetime/timedelta/total_seconds), 在一个老vps的2.6上部署时会出问题.
当时写了一个monkey patch, 加了这个特性, 后面换到linode的vps后, 就没什么用了.
def patch_timedelta():
if not hasattr(datetime.timedelta, 'total_seconds'):
import ctypes as C
_get_dict = C.pythonapi._PyObject_GetDictPtr
_get_dict.restype = C.POINTER(C.py_object)
_get_dict.argtypes = [C.py_object]
total_seconds = lambda self: \
(self.microseconds + (self.seconds + self.days * 24 * 3600) * 10 ** 6) / 10**6
d = _get_dict(datetime.timedelta)[0]
d['total_seconds'] = total_seconds
session后端用的redis存储, 和cache混用, 用前缀区分.
db迁移使用的alembic, versions目录没有加入git库, 每个机子都有自己的versions目录.
部署使用的fabric, 还是比较方便的.
代码库现在sloccount的结果是:
Totals grouped by language (dominant language first):
python: 977 (95.69%)
sh: 44 (4.31%)
部署的路径是
http://humanqiu.com , 基本是三无状态, 但总算是向前走了一步~~