XML-RPC Serialisierung beeinflußen
Hallo, ich benutze den XML-RPC Server und Client aus der Standardbibliothek. Wenn ich eine eigene Klasse übertragen will, wird nur das __dict__ übertragen, sämtliche Attribute sind vorhanden, aber sonst nichts. Das ist grundsätzlich kein Problem, ich würde jedoch gerne ein paar weitere Informationen mitgeben. Mir geht es nicht darum beim Empfänger das Objekt vollständig zu rekonstruieren. Einige, für den Empfänger interessante Werte liegen jedoch als Methode (bzw. deren Rückgabewert) vor und diesen würde ich gerne mitgeben. Gibt es eine spezielle Methode (ähnlich wie __str__) der Klasse, die aufgerufen wird, um eine für das Marshalling über XML-RPC brauchbare Form zu erzeugen? Ich denke mal, den Aufruf zu __dict__ zu überschreiben ist keine geschickte Idee. http://docs.python.org/library/xmlrpclib.html Danke, Florian
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Seltsame Frage....bei XML-RPC werden immer noch Methoden mit einer festen Signatur aufgerufen und der Client muss die Parameter analog call-by-value übergeben. Wieso willst Du also hier ein Objekt reinstecken...sorry, das macht keinen Sinn im Kontext von XML-RPC. Entweder Du übergibtst Die Parameter client-seitig explizit an den Client Proxy oder Du guckst Dich nach etwas um wie 'PyRO' oder du überträgst gleich das Objekt als Python-Pickle. - -aj Florian Lindner wrote:
Hallo,
ich benutze den XML-RPC Server und Client aus der Standardbibliothek. Wenn ich eine eigene Klasse übertragen will, wird nur das __dict__ übertragen, sämtliche Attribute sind vorhanden, aber sonst nichts. Das ist grundsätzlich kein Problem, ich würde jedoch gerne ein paar weitere Informationen mitgeben.
Mir geht es nicht darum beim Empfänger das Objekt vollständig zu rekonstruieren. Einige, für den Empfänger interessante Werte liegen jedoch als Methode (bzw. deren Rückgabewert) vor und diesen würde ich gerne mitgeben.
Gibt es eine spezielle Methode (ähnlich wie __str__) der Klasse, die aufgerufen wird, um eine für das Marshalling über XML-RPC brauchbare Form zu erzeugen? Ich denke mal, den Aufruf zu __dict__ zu überschreiben ist keine geschickte Idee.
http://docs.python.org/library/xmlrpclib.html
Danke, Florian _______________________________________________ python-de maillist - python-de@python.org http://mail.python.org/mailman/listinfo/python-de
- -- ZOPYX Limited | zopyx group Charlottenstr. 37/1 | The full-service network for Zope & Plone D-72070 Tübingen | Produce & Publish www.zopyx.com | www.produce-and-publish.com - ------------------------------------------------------------------------ E-Publishing, Python, Zope & Plone development, Consulting -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (Darwin) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iQGUBAEBAgAGBQJN9QgSAAoJEADcfz7u4AZjG7kLv2VYLyr1NQT1dVSYIvXaY/yk aUpe9Ef8e7BEL7lTrHhzYCZozltxB88OzDgNBAVfuCS6q1jYjxjJ3s6Jbdq0DZxY sdj0flBkcJgRlEkNe/WqqsbrJxDF1WQdZ61xxAQsKa4mGhnvOTh2Ctsjhis+Zl0s IEpYrWVnU589A7udu2nX1GnhCHsDWvW7lCG3mwoIhnVxk9Uc9ZD6jESnFFPWLmQK 9NVGdDo8lsjU+sLx5N4HWhthrEZXsClGJikgR/yj4l/6KvjJLXuxuynyLbwYIzPq kYAGEvFq4Ve+WsYdKkQrIVAUMrG9lGDofpdAWo66EsDYim3EQZ6Nk+esqRqVHzFm lKrS58GrYXlIG9uU7zUF5Q0Pvbs8Gk277WhICiyAjb0QgY8GGcf1HdD8crYOJrci cAlDYcWf/B8y8lP2SmT08m3cicg05Gtcdz3nhavVm3qdhj6sN+eVHZDpFu1gWsXw gPX7pkLZ59m6zh0X6Pq2IRUcYO7YE+A= =YYJ+ -----END PGP SIGNATURE-----
On Jun 12, 2011, at 8:40 PM, Andreas Jung wrote:
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
Seltsame Frage....bei XML-RPC werden immer noch Methoden mit einer festen Signatur aufgerufen und der Client muss die Parameter analog call-by-value übergeben. Wieso willst Du also hier ein Objekt reinstecken...sorry, das macht keinen Sinn im Kontext von XML-RPC.
Macht es sehr wohl, wenn man die Frage wirklich gelesen haette. Plus die Doku. Florian ist auf der Suche nach einer customisierten Serialisierung/De-Serialisierung von Objektzustaenden. Da geht es nicht um irgendwelche Methodenaufrufe von durch die Gegend gereichten Objektreferenzen... Leider scheint es nicht moeglich zu sein mittels zB des Pickle-Protokolls "dazwischenzugraetschen". @Florian Unter Umstaenden koennte dir JSON hier helfen. Das built-in-json erlaubt naemlich sowas. Du muesstest fuer deine entsprechenden Typen eine Serialisierung progarmmieren, zB indem du auf eine Methode wie __json__ zurueckgreifst, die dann zB so aussieht: class Foo(object): def __json__(self): res = { some_property : self.some_property } res.update(self.__dict__) return res Dann musst du in jeder XMLRPC-Methode/Funktion den Rueckgabewert "jsonifizieren". Das kann man zB durch einen Dekorator vereinfachen, oder gar einer Metaklasse. Der Vorteil des Ganzen: JSON selbst regelt schon den rekursiven Abstieg in die ueblichen Typen. Achtung: du musst die speziellen Objekte von XMLRPC (DateTime & Binary) natuerlich ebenfalls behandeln! Diez
Am Sonntag 12 Juni 2011, 20:52:03 schrieb Diez B. Roggisch:
On Jun 12, 2011, at 8:40 PM, Andreas Jung wrote:
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
Seltsame Frage....bei XML-RPC werden immer noch Methoden mit einer festen Signatur aufgerufen und der Client muss die Parameter analog call-by-value übergeben. Wieso willst Du also hier ein Objekt reinstecken...sorry, das macht keinen Sinn im Kontext von XML-RPC.
Macht es sehr wohl, wenn man die Frage wirklich gelesen haette. Plus die Doku.
Florian ist auf der Suche nach einer customisierten Serialisierung/De-Serialisierung von Objektzustaenden. Da geht es nicht um irgendwelche Methodenaufrufe von durch die Gegend gereichten Objektreferenzen...
Genau.
Leider scheint es nicht moeglich zu sein mittels zB des Pickle-Protokolls "dazwischenzugraetschen".
Schade.
@Florian
Unter Umstaenden koennte dir JSON hier helfen. Das built-in-json erlaubt naemlich sowas. Du muesstest fuer deine entsprechenden Typen eine Serialisierung progarmmieren, zB indem du auf eine Methode wie __json__ zurueckgreifst, die dann zB so aussieht:
class Foo(object):
def __json__(self): res = { some_property : self.some_property } res.update(self.__dict__) return res
Dann musst du in jeder XMLRPC-Methode/Funktion den Rueckgabewert "jsonifizieren". Das kann man zB durch einen Dekorator vereinfachen, oder gar einer Metaklasse.
Eine interessante Methode. Für *mein* Problem vom Implementierungsaufwand allerdings in keinem Verhältnis zur Größe des Problems. Hinzu kommt, dass ich von einem existierenden Server ableite und das Protokoll um einige Methoden erweitere. Diese sollten sich aber einfügen in die vorhandene API. Ich werde wohl einfach statt def xml-method(self): return object ein return object.some_dict_representation() machen. Grüße, Florian
participants (3)
-
Andreas Jung
-
Diez B. Roggisch
-
Florian Lindner