2016-07-21 29 views
0

所以有點設置。在web2py中,你可以簡單的裝飾控制器的功能,以公開爲JSON的服務,像這樣:如何在web2py模塊中使用json服務時避免多個服務對象?

def call(): 
    return service() 

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

然後你就可以(在一個Ajax請求等)調用它像「呼叫/ 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

裝飾器簡單地增加的功能字典,其被存儲在Service對象的屬性。因此,理論上你應該能夠將模塊的服務對象的字典與模型文件中定義的服務對象的字典合併。我還沒有嘗試過,但這樣的事情可能工作:

import mymodule 

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

你可以寫一個函數,將一組服務對象,併合並他們。

注意,屬性名json_procedures是一個內部實現細節,而不是公共API的一部分,所以並不保證保持向後兼容。

類似的方法應該與其他類型的服務(通過service.xml_procedures等)一起工作。

+0

哇,這很好!謝謝安東尼。是的,從這個例子我看到,更新服務對象的特定子集很容易。 – TheGerm

相關問題