Golang/Python最佳实践

统一好返回格式

  • 使用gRPC
  • 如果使用RESTful风格,那么返回结果无论成功还是失败,都应该遵循如下格式:
{
    "code": 200, // 业务代码code,可以用于详细错误判断
    "msg": "succeed", // 给开发人员看的错误提示
    "data": {} // 无论成功或者失败,有无数据,此处都应当返回一个dict/map而不应该是nil/None
}

为什么要这么做呢?因为使用动态语言开发时不会有太大差别,使用静态语言时,数据类型不一将会导致不好定义返回结果。

数据库

  • PG比MySQL好用,数据类型支持更加丰富,坑也更少,唯一的缺点是流行程度不如MySQL
  • 使用Redis作缓存,Redis的数据结构更加丰富,而且数据结构可以用作其他用途

Python

  • gunicorn + gevent异步比asyncio/tornado等更加方便
  • Flask 总体来说是一个好用的web框架
  • ORM使用 SQLAlchemy ,migration使用 alembic
  • 参数校验使用 marshmallow
  • 异步任务使用 gevent + python-rq,celery并发一高就容易遇到莫名假死的问题
  • 善用decorator,例如参数校验时,可以写如下代码:
@hello_bp.route("/")
@binding_schemma(HelloworldSchema)
def hello(data):
    return "hello world"

binding_schemma 的实现如下:

def binding_schemma(schema):
    def wrapper(func):
        def inner(*args, **kwargs):
            # 获取参数
            arguments = request.get_json() or request.form or request.args
            if arguments is None:
                return failed(msg="请检查参数")

            # 校验
            try:
                data = schema().load(arguments)
            except ValidationError as err:
                return failed(msg=err.messages)

            # 执行函数
            return func(data.data, *args, **kwargs)

        return inner
    return wrapper

Golang

  • Echo比GIN体验上好用一些
  • ORM还是pg好用一些,此外更喜欢 sqlx + SQLAlchemy + alembic

微信公众号
关注公众号,获得及时更新

更多文章
  • ArchLinux忽略某个包的升级
  • SQLAlchemy使用主从与数据库autocommit
  • Blackbox禁用IPv6
  • 预防缓存击穿
  • Go 1.13的errors挺香
  • flutter开发体验汇报
  • 自己封装一个好用的Dart HTTP库
  • Flutter应用启动后检查更新
  • Grafana Gravatar头像显示bug修复
  • flutter中使用RESTful接口
  • Vim YouCompleteMe使用LSP(以dart为例)
  • flutter webview加载时显示进度
  • SQLAlchemy快速更新或插入对象
  • 修复Linux下curl等无法使用letsencrypt证书
  • 欣赏一下K&R两位大神的代码