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呢?

在这种情况下,您只需重写loaddumpWebserviceHandlerSyncWebserviceHandler

的子类中的方法

下面是一个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 --

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java连接usb到uart设备到安卓设备>3.1   可以强制Php中的web应用程序与Java中的桌面应用程序一起工作吗?   java为什么自定义系统类加载器不工作?   数组在Java中解析具有多个分隔符的字符串   PMD Java 8德米特定律   JavaSpringMVC表单验证不适用于嵌套的复杂类型   让Eclipse Java组织导入以使用Google checkstyle   java Appium:无法创建新会话   java如何在数组中声明新字段   java如何解决“无法初始化类org.apache.cassandra.config.DatabaseDescriptor”?   java AsyncTask创建socket   java向@CreatedBy添加更多信息   如何在ubuntu中运行包含大量jars依赖项的java文件   java如何使用<s:select>标记并在中休眠来填充下拉列表?   java获取错误:找不到符号变量“level”和“next_level_button”   javaweb应用中基于UI的ajax显示代码流   Java长到MySql   java JvisualVM:奇怪的应用程序行为   ubuntu将Java程序的输出结果保存到一个文件中