json-rpc Dispatcher-Methode

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
SSSleep
User
Beiträge: 1
Registriert: Freitag 30. Juni 2017, 22:57

Hallo zusammen,

ich möchte gerne mit Python auf meinem NAS-Server eine kleine Serverapplikation aufbauen, die es mir ermöglicht mit Hilfe von JSON-RPC Befehlen Skripte usw. auszuführen.

Dafür habe ich das Paket json-rpc 1.10.3 installiert und die Demo-Implementierung ausprobiert. Soweit funktioniert es, aber die Server-Seite verstehe ich nicht. Hier werde ich insbesondere aus der Dispatcher-Methode nicht schlau. die Doku dazu habe ich gelesen: http://json-rpc.readthedocs.io/en/lates ... tcher.html :(
Hier einmal der Referenzcode:

Code: Alles auswählen

from werkzeug.wrappers import Request, Response
from werkzeug.serving import run_simple

from jsonrpc import JSONRPCResponseManager, dispatcher


@dispatcher.add_method
def foobar(**kwargs):
    return kwargs["foo"] + kwargs["bar"]


@Request.application
def application(request):
    # Dispatcher is dictionary {<method_name>: callable}
    dispatcher["echo"] = lambda s: s
    dispatcher["add"] = lambda a, b: a + b

    response = JSONRPCResponseManager.handle(
        request.data, dispatcher)
    return Response(response.json, mimetype='application/json')


if __name__ == '__main__':
    run_simple('localhost', 4000, application)
Ich verstehe, dass in der letzten Zeile ein Webserver gestartet ist, der dann auf Port 4000 lauscht. Dieser Webserver ruft bei Bedarf die "callback"-Funktion application auf. Dies ist Bestandteil des Paketes "werkzeug". Am Ende der Funktion, wird eine Response an den Client geschickt. Die lambda Funktion verstehe ich auch noch. In einem Fall wird der String einfach zurückgegeben, im anderen Fall ist der Rückgabewert a+b.

wie gesagt, die Dispatcher-Methode und ihre Anwendung verstehe ich nicht.

Hier ist mir der Verwendungszweck nicht klar. Ich finde die Stelle nicht, an der diese Funktion jemals aufgerufen wird:

Code: Alles auswählen

@dispatcher.add_method
def foobar(**kwargs):
    return kwargs["foo"] + kwargs["bar"]
Hier ist mir die Syntax nicht klar. Die Methode mit eckiger Klammer kann ich nirgendwo als Beispiel finden:

Code: Alles auswählen

dispatcher["echo"] = ...
dispatcher["add"] = ...
Zuletzt geändert von Anonymous am Freitag 30. Juni 2017, 23:55, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@SSSleep: Die `foobar`-Funktion wird aufgerufen wenn die JSON-RPC-Methode `foobar` aufgerufen wird. Da die Funktion Schlüsselwortargumente verarbeitet, muss `params` in dem Fall als Objekt und nicht als Array übergeben werden und die Attribute `foo` und `bar` enthalten.

Methoden mit eckiger Klammer gibt es nicht. So ein `Dispatcher` funktioniert mindestens teilweise als Abbildungstyp, wie beispielsweise Wörterbücher (`dict`). Auf der linken Seite einer Zuweisung könnte ja auch gar kein Methodenaufruf stehen. Du weist damit dem Wert in den eckigen Klammern die Funktion, oder allgemein das aufrufbare Objekt, auf der rechten Seite der Zuweisung zu.

Der Dispatcher (Zusteller, Verteiler) sorgt für die Verbindung der JSON-RPC-Anfragen zu den Python-Funktionen die für deren Antworten zuständig sind. Intern wird der sehr wahrscheinlich auch ein Wörterbuch verwenden das die JSON-RPC-Namen auf Python-Funktionen abbildet.
Antworten