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

时间:2016-07-21 23:41:38

标签: web2py

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

def call():
    return service()

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

然后你可以调用它(比如在ajax请求中),比如“call / json / do_something”,你会得到“blah”,格式化为json。

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

 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()

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

1 个答案:

答案 0 :(得分:1)

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

import mymodule

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

您可以编写一个函数,该函数接受一组服务对象并将它们全部合并。

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

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