在 web2py 模块中使用 json 服务时如何避免多个服务对象?

How to avoid multiple service objects when using a json service in a web2py module?

所以有点设置。在 web2py 中,您可以简单地修饰控制器函数以将其公开为 json 服务,如下所示:

def call():
    return service()

@service.json
def do_something():
    return "blah"

然后你可以像 "call/json/do_something" 这样调用它(就像在 ajax 请求中一样)你会得到 "blah",格式为 json.

您可以在模块的 class 中执行此操作,如下所示:

 from gluon.tools import Service
 service = Service()

 class SomeClass(object):
    @staticmethod
    @service.json
    def do_something():
       return "blah"

所以在你的控制器中你可以这样做:

 import mymodule

 def m_call():
     return mymodule.service()

 def call():
     return service()

 @service.json
 def do_another_thing():
     return "blee"

然后在视图中,我可以调用任一服务,例如 "m_call/json/do_something" 或 "call/json/do_another_thing"。这行得通,但我现在有多种方法可以调用 json 服务。这有一个好处,模块服务的范围不同,但至少在某些情况下我希望能够在我的控制器中做这样的事情:

 import mymodule

 def call():
    # This obviously does NOT work, but shows what I WANT to do
    service.merge_with(mymodule.service) 

    return service()

结果是我的所有服务(或我想要的任何服务)都在单个服务对象中公开,并且可以使用相同的语法调用,无论函数在我的应用程序中的位置如何。有办法吗?

装饰器只是将函数添加到字典中,字典存储在 Service 对象的属性中。因此,理论上您应该能够将模块服务对象的字典与模型文件中定义的服务对象的字典合并。我没试过,但这样的方法可能有用:

import mymodule

def call():
    service.json_procedures.update(mymodule.service.json_procedures)
    return service()

您可以编写一个函数来获取一组服务对象并将它们全部合并。

请注意,属性名称 json_procedures 是内部实现细节,不是 public API 的一部分,因此不能保证向后兼容。

类似的方法应该适用于其他类型的服务(通过 service.xml_procedures 等)。