Tornado的Web服务装饰器
dizzydecor的Python项目详细描述
dizzydecor是一个python库,它可以方便地创建web服务 在龙卷风中。为此,库添加了两个新类和装饰器 这有助于消除对样板代码的需求。
示例
下面是一个示例,演示dizzydecor如何工作:
fromtornado.ioloopimportIOLoopfromdizzydecorimport(WSApplication,WebserviceHandler,webservice,servicemethod)@webserviceclassMyWebService(WebserviceHandler):@servicemethod()asyncdefecho(self,message):returnf"You said: {message}"@servicemethod(httpmethod="GET")asyncdefmy_greeting(self):returndict(greeting="Hello, welcome to my web service demo!")if__name__=="__main__":app=WSApplication()app.listen(8080)IOLoop.current().start()
这将创建一个具有两种服务方法的web服务:echo和my_greeting。 默认情况下,服务方法响应post请求;但是,httpmethod 参数servicemethod可以更改此行为。例如, 我的问候语设置为响应GET请求。
- 路径是基于类和方法名生成的。
- web服务的路径是小写的类名,每个单词由连字符连接。(MyWebService->;我的Web服务)
- 方法的路径是用下划线代替连字符的方法名。(我的问候语->;我的问候语)
同样值得注意的是,如果一个服务方法没有获得 参数时,服务处理程序发送400 http状态代码。
要进行测试,可以使用curl:
$ curl http://localhost:8080/my-web-service/echo -d '{"message": "This is my message"}' "You said: This is my message" $ curl http://localhost:8080/my-web-service/my-greeting {"greeting": "Hello, welcome to my web service demo!"}
您可能已经注意到该示例使用json。
如果我不想使用json呢?
在这种情况下,您只需重写load和dumpWebserviceHandler或SyncWebserviceHandler
的子类中的方法下面是一个PyYAML:
# -- snip --importyamlclassYAMLServiceHandler(WebserviceHandler):defload(self,request):returnyaml.safe_load(request)defdump(self,response):# You can also set content-type here with self.set_headerreturnyaml.safe_dump(response)@webserviceclassYetAnotherService(YAMLServiceHandler):@servicemethod()asyncdefjoin(self,arr,delim):returndict(message=delim.join(map(str,arr)))# -- snip --
其余的完全相同,只是现在您的服务将使用yaml。
下面是如何使用curl测试它:
$ curl http://localhost:8080/yet-another-service/join --data-binary @"/dev/stdin"<<_eof_ arr: - Hello - world delim: " " _eof_ message: Hello world
安装
使用PIP或Easy_安装:
$ pip install dizzydecor
dizzydecor仅适用于python 3
非标准http方法呢?(实验性)
在这种情况下,您只需扩展supported_methods属性 服务处理程序类的。
# -- snip --@webserviceclassNotificationService(WebserviceHandler):SUPPORTED_METHODS=WebserviceHandler.SUPPORTED_METHODS+("NOTIFY",)@servicemethod(httpmethod="NOTIFY")asyncdefnotification(self,message):# etc# -- snip --
新http方法的脚本被添加到服务处理程序中 在创建web服务期间。在那之后,你需要做的就是 do设置为服务方法以响应该请求类型。依靠 在这种情况下,您可能还需要自定义参数的方式 通过重写prepare解析。
同步服务
WebserviceHandler是异步的;但是,可以使 使用SyncWebserviceHandler类的服务处理程序。
# -- snip --@webserviceclassMySyncService(SyncWebserviceHandler):# This time the method is not async@servicemethod(httpmethod="GET")defmy_greeting(self):returndict(greeting="Hello...")# -- snip --