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

Tornado python REST api with multiple handlers but same parameter types

我正在使用 Tornado 制作应用程序(使用 Tornado-JSON)。 我的目通过)例如:

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

我什么也做不了

在这种情况下,一切都是无用的,因为第二个 class (ServiceIdHandler) 总是被调用。

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

/hostedservices/services/?tenant_id=VALUE 要么 /hostedservices/services/?id=值

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

我将不胜感激此时能得到的所有帮助...

谢谢!

这条路由应该可以解决您的问题:

[
  "/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/VALUE 生成路由 /hostedservices/services/tenant/VALUE 将为 ServicesIdHandler 生成(而不是 /hostedservices/services/?tenant_id=VALUE 或 /hostedservices/services/?id=value 路由) .

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

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):
    ....