【问题标题】:Tornado python REST api with multiple handlers but same parameter typesTornado python REST api具有多个处理程序但参数类型相同
【发布时间】:2015-04-06 11:48:21
【问题描述】:

我正在使用 Tornado 制作应用程序(使用 Tornado-JSON)。 我的目标是创建返回 JSON 的 rest 服务,并且可以只处理传入参数的任何内容 - 如果需要,可以搜索/查找(尝试为 emberjs 提供 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

,我不能让它接收任何东西

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

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

/hostedservices/services/?tenant_id=VALUE 或者 /hostedservices/services/?id=value

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

我将不胜感激在这一点上我能得到的所有帮助......

谢谢!

【问题讨论】:

  • 嘿!这有点晚了,但我只是想说我正在为 Tornado-JSON(v2.0)重写可定制的路由,以使其更容易和更清晰(我是作者)。分行已经做了很长一段时间了,但我真的很忙,没有太多时间来处理它。如果您有兴趣了解它的发展方向,您可以查看到目前为止我在差异​​底部为自己留下的一些 cmets (github.com/hfaran/Tornado-JSON/compare/…)

标签: python json rest tornado


【解决方案1】:

这个路由应该可以解决你的问题:

[
  "/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 路由)。

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

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

【讨论】:

  • 谢谢!这确实回答了我的问题,尽管我正在努力弄清楚如何对可能包含的每个属性进行全面搜索。作为替代方案,我开始使用 handler.get_argument() 来获取参数并将它们用作搜索参数...
猜你喜欢
  • 1970-01-01
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
相关资源
最近更新 更多