本文主要记录功能开发过程,以用到的知识点或者功能点为章节总结。

目录:

Python

关于 Python,熟悉语言肯定是基础,可以让开发变得简单、高效,此外可能还需要做下面的工作:

References

配置文件

自己实现了一个配置文件管理模块,具有如下功能:

  • 像访问类属性一样访问每一个配置项,代码清晰简洁;
  • 支持默认配置、本地配置;
  • 支持同时配置多套环境;
  • 通过启动命令中的参数指定运行环境;

References

日志

对于线上程序,日志对于定位问题至关重要,本公众号后台程序基于 getlogbook/logbook 自定义了一个日志模块,主要完成下面的功能:

  • 自定义日志格式;
  • 支持不同级别的日志;
  • 可根据级别处理日志,如 Debug 只在开发环境打印,Info 输出到文件,Error 邮件通知;
  • 对于 Error log,通过邮件的方式通知我,及时发现问题;
    • 完成该功能时,邮件发送方账号需要开启 POP3/SMTP服务,并将验证密码配置为 授权密码,保证邮箱账号原始密码的安全;

一些不错的日志库

References

WeRoBot

通过使用 WeRoBot,省去和微信服务器的交互工作,专注于公众号功能的实现,使用下来没发现什么特别的问题,而且使用简单,值得推荐;

WeRoBot 默认单线程运行,通过配置可多线程运行,本程序借助于 gevent 实现多线程,具体配置也非常简单,在主逻辑代码中加入下面的配置即可:

main.py
1
2
3
4
5
6
from gevent import monkey
monkey.patch_all()
robot = werobot.WeRoBot(...)
robot.run(server='gevent')

References

SQLAlchemy

通过 SQLAlchemy 访问 MySQL,支持 ORM,支持一定的连接管理,使用还挺简单,用到的版本如下:

  • MySQl 5.7.19
  • SQLAlchemy-1.1.15

需要安装下面的库:

  • pip install SQLAlchemy
  • pip install pymysql
  • pip install sqlalchemy-repr

Session

注意多线程下 Session 的管理,保证一个 Session 最多被一个线程使用,并且能及时的提交、回滚、释放,多线程下可通过下面的方式管理:

  • 借助于 Python 的上下文管理器(@contextmanager)实现;
  • 自定义上下文,结合 scoped_session 实现;

ORM

遇到的问题:

刚上线的第二天就收到了异常邮件,提示错误:(pymysql.err.OperationalError) (2006, “MySQL server has gone away (BrokenPipeError(32, ‘Broken pipe’))”),经查证是由于 MySQL 默认 8 小时断开连接的问题导致的,参考了下面的文章:

解决办法:
对于当前的 1.1.15 版本,在 create_engine 时配置 pool_recycle 参数即可,确保每个连接的寿命不超过指定的数值;在未来的 1.2.x 版本可以通过 pool_pre_ping 参数配置;
create_engine(url, echo=False, pool_size=5, pool_recycle=3600)

SQLAlchemy 分表

本项目没有用到分表,分表在之前写一个测试工具时用到过,当时看过下面的文章,在此一并总结一下:

References

有限状态机

本项目采用有限状态机(FSM)实现用户对话状态的控制,具体交互流程如下:

  • 接收用户信息;
  • 读取 Session 中的状态机信息,还原状态机;
  • 根据用户输入驱动状态机进入下一个状态;
  • 将当前的状态机信息存入 Session;
  • 读取状态机当前的处理结果返回给用户;
  • 依此循环上述流程;

注:其中的 Session 为 WeRoBot 中的 Session。

本项目采用开源的 pytransitions/transitions

transitions

安装 transitions,安装后面两个库的原因是为了使用其中的 GraphMachine,将状态机以图片的形式输出;

  • pip install transitions
  • brew install graphviz
  • pip install pygraphviz
    • 安装 pygraphviz 之前需要安装 sudo apt-get install python-dev graphviz libgraphviz-dev pkg-config

几个主要概念:

  • 状态(State)
  • 状态转移(Transition)
  • 回调(Callback),用于在状态发生变化时通知业务逻辑,完成相应的处理
    • 可自定义回调参数,建议打开 send_event ,通过键值对的方式传递;

回调顺序(Callbacks Order)

下面代码层次结构展示了状态变化时,回调的触发顺序:

1
2
3
4
5
6
7
8
9
10
11
12
'machine.prepare_event'
'transition.prepare'
'transition.conditions'
'transition.unless'
'machine.before_state_change'
'transition.before'
'state.on_exit'
<STATE CHANGE>
'state.on_enter'
'transition.after'
'machine.after_state_change'
'machine.finalize_event'

References

测试

本项目只在开始阶段搭建了测试框架,写了基本的测试 Demo,后续由于时间原因(懒),并未增加业务逻辑对应的测试用例…

Faker 是一个挺不错的库,可用于构造测试数据。

References