交互协定 status_code.py

理论背景

实际开发中数字来表示不同的状态,状态较少时直接配置常量定义即可,如

# 使用时直接使用变量名,含义更清晰
PREPARE = 0
GET_TASK = 1
DO_TASK = 2
CLEAN_UP = 3

HTTP协议客户端与服务端交互的协议,双方定义的状态码较多,需采用一种更加灵活的方式

源码分析

# 定义原始数据结构
_codes = {
    200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'),
    301: ('moved_permanently', 'moved', '\\o-'),
    302: ('found',),
    404: ('not_found', '-o-'),
    500: ('internal_server_error', 'server_error', '/o\\', '✗'),
}

# codes全局变量,LookupDick对象,codes.okay或codes['okay'] 都行
codes = LookupDict(name='status_codes')

# 因requests/__init__.py中from .status_codes import codes,所以会执行该模块代码

def _init():
    for code, titles in _codes.items():
        for title in titles:
            setattr(codes, title, code)
            if not title.startswith(('\\', '/')):
                setattr(codes, title.upper(), code)
# 导入时已触发执行: 全局变量codes经过setattr把所有短语和状态码进行绑定
_init()
  • 全局项目可以使用codes.name来表示相应状态码

  • _codes作为原始数据源,自动加载设置成codes

项目实践

1. API通用返回格式

前后端分离开发离不开双发返回状态码的格式定义,随着业务的不断增长,状态码定义需可配置

如何实现可配置扩展的状态码映射结构体

  • 定义一个结构体存储 错误码: (错误代码名称,默认错误信息)

  • 生成的对象支持 store.E_SUCC

  • 根据项目需要,可以自定义status_code.json文件,或者单独项目以供多个项目使用

2. 函数之间标识符

3. 多人之间协议

Last updated