2016-07-21 17 views
0

Also ein bisschen Setup. In web2py können Sie einfach eine Controller-Funktion dekorieren sie als json Service zu belichten, etwa so:Wie vermeidet man mehrere Service-Objekte bei der Verwendung eines JSON-Dienstes in einem web2py-Modul?

def call(): 
    return service() 

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

Dann können Sie es nennen (wie in einer Ajax-Request) wie "Call/json/do_something" und Sie werden bekomme "blah", formatiert in json.

Sie können dies in einem Modul in einer Klasse tun, etwa so:

from gluon.tools import Service 
service = Service() 

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

Also in Ihrem Controller, dies zu tun:

import mymodule 

def m_call(): 
    return mymodule.service() 

def call(): 
    return service() 

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

Und dann in einer Ansicht, die ich anrufen kann entweder "m_call/json/do_something" oder "call/json/do_another_thing". Das funktioniert, ABER ich habe jetzt mehrere Möglichkeiten, json-Dienste aufzurufen. Es ist ein auf den Kopf dazu, dass die Moduldienste unterschiedlich scoped sind, aber zumindest unter bestimmten Umständen möchte ich in der Lage sein, etwas wie dies in meinem Controller zu tun:

import mymodule 

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

    return service() 

Das Ergebnis ist, dass alle meine Dienste (oder was auch immer ich will) sind in einem einzigen Serviceobjekt verfügbar und können mit der gleichen Syntax aufgerufen werden, unabhängig davon, wo die Funktion in meiner Anwendung ist. Gibt es eine Möglichkeit, dies zu tun?

Antwort

1

Der Dekorator fügt die Funktion einfach einem Wörterbuch hinzu, das in einem Attribut des Objekts Service gespeichert ist. Theoretisch sollten Sie also nur das Wörterbuch des Dienstobjekts des Moduls mit dem Wörterbuch des in der Modelldatei definierten Dienstobjekts zusammenführen können. Ich habe es nicht ausprobiert, aber so etwas wie dies funktionieren könnte:

import mymodule 

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

Sie könnten eine Funktion schreiben, die eine Reihe von Dienstobjekten nimmt und verschmilzt sie alle.

Beachten Sie, dass der Attributname json_procedures ein internes Implementierungsdetail ist, das nicht Teil der öffentlichen API ist. Daher ist die Abwärtskompatibilität nicht garantiert. Ein ähnlicher Ansatz sollte mit den anderen Arten von Diensten (über , etc.) funktionieren.

+0

Wow, das funktioniert super! Danke, Anthony. Und ja, aus diesem Beispiel sehe ich, dass es einfach wäre, eine bestimmte Teilmenge der Serviceobjekte zu aktualisieren. – TheGerm