基于falcon框架的rpc api
falcon-rpc的Python项目详细描述
猎鹰rpc
背景
利用Falcon Framework创建http rpc api的包装器。
这个api的动机是Slack Web API。
note:首先,我建议您自己熟悉falcon和slack的api。
我发现自己为各种项目创建了大量的api,并且意识到restfulapi对于我所处理的类型的东西并不是很有用。虽然我通常需要执行一定程度的crud操作,但我创建的许多“资源”用于启动后端处理作业、运行异步分析工作负载、执行复杂查询等。
我做的大多数事情都不适合休息。坦率地说,不是“弯曲”的休息来适应我的意志,我发现API就像松弛,看起来足够灵活,足以适应任何使用情况。然而,当我为我的出价而弯腰休息时,我变得非常喜欢猎鹰框架。我百分之百的理解猎鹰是为休息而设计的,但是你猜怎么着,我可以做任何我想做的事,所以我们在这里。
快速启动
克隆repo并安装。
cd falcon_rpc
pip install -I .
importfalcon_rpcclassTest:"""``test`` method family """defok(self,req):# /test.okreq.resp_body={'foo':'bar'}deferror(self,req):# /test.error# can raise an error at anytimeraisefalcon_rpc.RPCError('dummy_error_code')deffatal(self,req):# /test.fatalnot_a_dict=1not_a_dict['nope']=2# pylint: disable=unsupported-assignment-operation # noqadefecho(self,req):# /test.echoreq.resp_body={'you_sent':req.params}defwarn(self,req):# /test.warnreq.resp_body={'data':'mostly good'}# setting a warning even though the request was handledreq.set_warning('some_warning')classAnother:defshow_me(self,req):# req.req is the original Falcon Request objectreq.resp_body={'hello_there':req.req.remote_addr}defstart():rpc=falcon_rpc.RPC()rpc.add_family(Test())rpc.add_family(Another())returnrpc()
它可以像猎鹰一样发射:
$ gunicorn -b :8000 "app:start()" --workers 2 --log-level DEBUG --reload
方法族和方法
您不需要向api添加路由,而是添加方法族,这里是python类。
您的api遵循像slack这样的/METHOD_FAMILY.method
结构,python类的名称对应于方法系列,并且该类的方法被用作被调用的实际方法。
需要注意的是,方法系列名称不区分大小写,它们总是被转换为小写。
方法名区分大小写。
方法处理程序
方法处理程序获取一个arg,即RPCRequest
的实例。
可以使用响应数据设置此对象的resp_body
属性。
像slack一样,如果您的请求可以被处理,但是您需要添加一个警告,那么您可以使用set_warning
方法来添加警告。
测试
$ pip install -r test-requirements.txt
$ pytest -s -vv --cov falcon_rpc --cov-report=term-missing tests/