json-rpc Dispatcher-Methode

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

json-rpc Dispatcher-Methode

Beitragvon SSSleep » Freitag 30. Juni 2017, 23:26

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/latest/dispatcher.html :(
Hier einmal der Referenzcode:
  1. from werkzeug.wrappers import Request, Response
  2. from werkzeug.serving import run_simple
  3.  
  4. from jsonrpc import JSONRPCResponseManager, dispatcher
  5.  
  6.  
  7. @dispatcher.add_method
  8. def foobar(**kwargs):
  9.     return kwargs["foo"] + kwargs["bar"]
  10.  
  11.  
  12. @Request.application
  13. def application(request):
  14.     # Dispatcher is dictionary {<method_name>: callable}
  15.     dispatcher["echo"] = lambda s: s
  16.     dispatcher["add"] = lambda a, b: a + b
  17.  
  18.     response = JSONRPCResponseManager.handle(
  19.         request.data, dispatcher)
  20.     return Response(response.json, mimetype='application/json')
  21.  
  22.  
  23. if __name__ == '__main__':
  24.     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:
  1. @dispatcher.add_method
  2. def foobar(**kwargs):
  3.     return kwargs["foo"] + kwargs["bar"]


Hier ist mir die Syntax nicht klar. Die Methode mit eckiger Klammer kann ich nirgendwo als Beispiel finden:
  1. dispatcher["echo"] = ...
  2. dispatcher["add"] = ...
Zuletzt geändert von BlackJack am Freitag 30. Juni 2017, 23:55, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
BlackJack
Moderator
Beiträge: 32710
Registriert: Dienstag 25. Januar 2005, 23:29
Wohnort: Berlin
Kontaktdaten:

Re: json-rpc Dispatcher-Methode

Beitragvon BlackJack » Samstag 1. Juli 2017, 00:15

@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.
“XML combines all the inefficiency of text-based formats with most of the unreadability of binary formats :-)” — Oren Tirosh, c.l.p, 2002

Zurück zu „Netzwerkprogrammierung“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder