+-------------------------------------------------------------+
| WEB brower |
+-----------------------------------^-------------------------+
/ | |
| +--------------------V--------------|-------------------------+
| | +----------------HTTPServer(Threadpool&Queue)-------------+ |
| | | +-------------------+ put +-----------------------+ | |
| | | |ThreadPool(Queue) <------+ HTTPConnection | | |
| | | |+---------------+ | | +-------------------+ | | |
| | | ||WorkerThread | | | |req=HTTPRequest() | | | |
| | | ||+-+ +-+ +-+ +-+| | | |req.parse_request()| | | |(把 socket 字节流,按 HTTP 协议解析)
| | | ||+-+ +-+ +-+ +-+| | | |req.respond()#^!^ | | | |(封装了 WSGIGateway.response)
| | | |+-|---|---|---|-+ | | +-------------------+ | | |
| | | +--|---|---|---|----+ +-----------------------+ | |
| | +------|---|---|---|-----------------------^--------------+ |
| | | | | | | | WSGI server
| | +------V---V---V---V-WSGIGateway(response)-|--------------+ |
| | | +------------------+-------------+| |
| | |+----------------+ | +----------+ +-------------+ || |
| | || gen environ | | |header_set| |response body| || |
| | |+-----+----------+ | +----------+ +-------------+ || |
| | | | +--^------^----------^-----------+| |
| | +------|-------------------|------|----------|------------+ |
| +--------|-------------------|------|----------|--------------+
| .........|...................|......|..........|......................
| | | | |
| +--------V--------+ | | |
| | req | | | | (1) 封装 environ 为 Request
| +-----------------+ | | | 生成 reqid
Butterfly | | | |
| | | | | \
| +--------V--------+ | | | |(2) 路由
| | apiname_getter | | | | | 在路由字典中匹配 environ['PATH_INFO']
| +-----------------+ | | | | {
| | | | | | '/apidemo/ping':
| | | | | | <xlib.protocol_json.Protocol object>,
| +--------V--------+ False +--+--+ | | | '/{app}/{handler}':
| |is_protocol_exist|------>| 400 | | | | <xlib.protocol_json.Protocol object>
| +-----------------+ +-----+ | | | }
| | | | /
| .........|..........................|..........|......................
| | (protocol_process) | | \
| V | | |(3) 返回 Response
| +-----------------+ | | | 参数:第一个参数为 Request 实例化对象 req
| | protocol | Exception +-----+ | | 其他参数为 GET 请求参数名
| | +-------------+ |------------->| 500 | | | 例子:environ['QUERY_STRING']: 'age=16'
| | |/app1/handler| | +-----+ | | +-------------handler demo---------------
| | |/app2/handler| |Normal+----------------------------+| |@funcattr.api # 标识 handler 类型
| | +--+-------+--+ |----->|httpstatus, headers, content|| |def demo(req, age):# req + HTTP 请求参数
| +----|-------|----+ +----------------------------+| | #(状态信息,数据信息,响应头列表)
| | | | | return "OK", {"data": age}, []
| | | / +----------------------------------------
| | +----V----------------------------------+
| | |+---------+ +---------+ +-----------+|
| | ||DiskCache| | FSM | |APScheduler|| 基础公共库
| | |+---------+ +---------+ +-----------+|
| | +---------------------------------------+
| +----V------------------------------------------+
| | (Redis ORM) / (MySQL ORM) / RAL | 数据访问层
\ +-----------------------------------------------+