Tornado python REST api具有多个处理程序但参数类型相同

时间:2015-04-06 11:48:21

标签: python json rest tornado

我正在使用Tornado(使用Tornado-JSON)制作应用程序。 我的目标是创建返回JSON的休息服务,并且可以处理参数中传递的任何内容 - 如果需要搜索/查找(尝试使用JSON为不同的参数传递emberjs),例如:

class ServicesHandler(CorsMixin,APIHandler):
....
__url_names__ = ["services"]

class ServicesTenantHandler(ServicesHandler):
    def get(self, tenant_id):
    ....

class ServicesIdHandler(ServicesHandler):
    def get(self, id):
    ....

这就是我在上面的路线中得到的结果:

  [
    "/hostedservices/services/(?P<id>[a-zA-Z0-9_]+)/?$",
    "<class 'sysinfo.hostedservices.ServicesIdHandler'>"
  ],
  [
    "/hostedservices/services/(?P<tenant_id>[a-zA-Z0-9_]+)/?$",
    "<class 'sysinfo.hostedservices.ServicesTenantHandler'>"
  ]

但是我不能让它收到任何东西,但/ hostedservices / services / SOME_VALUE

在这种情况下,一切都没用,因为总是调用第二个类(ServiceIdHandler)。

我对所有蟒蛇和龙卷风都很陌生,但不应该(按照路线)以这种方式调用:

/ hostedservices /服务/?tenant_id = VALUE 要么 / hostedservices /服务/?ID =值

肯定我会有更多的属性,但不知何故,当我从soapUI测试它似乎我总是必须传递1参数作为URL路径(模板样式参数)的一部分而不是常规参数,因为我不能它有2个具有相同属性类型(但属性不同)的处理程序

我将非常感谢我现在能得到的所有帮助......

谢谢!

1 个答案:

答案 0 :(得分:0)

此路由应解决您的问题:

[
  "/hostedservices/services/tenant/(?P<id>[a-zA-Z0-9_]+)/?$",
  "<class 'sysinfo.hostedservices.ServicesTenantHandler'>"
],
[
  "/hostedservices/services/(?P<id>[a-zA-Z0-9_]+)/?$",
  "<class 'sysinfo.hostedservices.ServicesIdHandler'>"
]

将为 ServicesTenantHandler 生成 / hostedservices / services / tenant / VALUE 路由,路由 / hostedservices / services / VALUE 将为为 ServicesIdHandler 生成(而不是/ hostedservices / services /?tenant_id = VALUE或/ hostedservices / services /?id = value routes)。

为了获得此结果,处理程序必须是:

class ServicesHandler(CorsMixin, APIHandler):
    __url_names__ = ["services"]
    ....

class ServicesTenantHandler(ServicesHandler):
    __url_names__ = ["services/tenant/"]

    def get(self, id):
    ....

class ServicesIdHandler(ServicesHandler):
    def get(self, id):
    ....