[python] XML-RPC

Radek Kanovsky rk na dat.cz
Pátek Červenec 18 17:46:36 CEST 2008


On Thu, Jul 17, 2008 at 11:20:07AM +0200, Petr Dlabal wrote:

> Moje zkusenosti jsou jen o malo vetsi nez nula, ale podle me xmlrpclib
> neumi serializovat new-style class, tzn. class Foo(object):pass nelze.

On sice umi serializovat old-style tridu, ale na druhe strane z toho
uz nevyleze instance puvodni tridy, ale obycejny dict.

    >>> import xmlrpclib
    >>> class X: pass
    ...
    >>> x = X()
    >>> x.a = 42
    >>> xmlrpclib.loads(xmlrpclib.dumps((x,)))
    (({'a': 42},), None)

Protoze XMLRPC by melo fungovat mezi implementacemi v ruznych jazycich,
je mnozina podporovanych datovych typu a kontejneru hodne omezena.

> Pokusne jsem to resil (a snad by to melo jit) ze jsem tu slozitou
> classu pred vyslanim xml-rpc serverem (tzn. pred serializaci)
> zapikloval a pak zas v klientovi rozpikloval...
> stara class Foo:pass by mela jit serializovat snad i celkem slozita

To by mohlo fungovat, pokud vam do toho nepoleze nikdo cizi. Prijmat
zapiklena data od neduveryhodneho zdroje se z bezpecnostnich duvodu
nedoporucuje. A moc pekne ta dvojnasobna serializace take nevypada :-)
Pokud ten objekt neni moc slozity, stacilo by mozna jednoduse poslat
pres RPC jeho __dict__ a na druhe strane instanci zrekonstruovat.

    # server
    >>> rpcdata = xmlrpclib.dumps((x.__dict__,)))

    # klient
    >>> ((state,),_) = xmlrpclib.loads(rpcdata)
    >>> state
    {'a': 42}
    >>> y = X()
    >>> y.__dict__.update(state)

Radek Kaňovský, Dat, s.r.o.


Další informace o konferenci Python