just RPC

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Gibt's für Python noch andere RPC-Ansätze als XML-RPC? Ich suche sowas wie SimpleXMLRPCServer, was sich aber auch für Dateiübertragungen eignet... bei SimpleXMLRPCServer müsste man Binärdaten immer Base64-codieren; außerdem macht XML etwas Overhead...
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Wenn du mit XML-RPC Daten übertragen willst bietet es sich an diese per HTTP zu übertragen. RPC bietet sich, soweit ich das beurteilen kann, nicht zum Übertragen von Daten an. Dazu brauchst du Streams und nicht Calls.

- Jonas
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

JSON-RPC gibt es. Implementierungen sind mir so nicht bekannt, kann man möglicherweise aber selbst zusammenkombinieren.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Y0Gi hat geschrieben:JSON-RPC gibt es. Implementierungen sind mir so nicht bekannt, kann man möglicherweise aber selbst zusammenkombinieren.
Löst das Problem mit den Files/Streams aber auch nicht. ;)
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Wie schon geschrieben, ist HTTP ein Protokoll, welches sich gut für Datenübertragungen eignet. :wink:
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

droptix hat geschrieben:Dateiübertragungen
Hallo droptix!

Ich halte veers Vorschlag, HTTP für den Datentransfer zu verwenden, für sehr gut.

Hier ein Beispiel mit CherryPy:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import cherrypy
from cherrypy.lib.static import serve_file


class Root(object):
    
    def get_image(self, imagename, username, password):
        if username == "aaa" and password == "bbb":
            return serve_file(r"H:\GEROLD\Bilder und Videos\%s" % imagename)
        else:
            return "nix da..."
    get_image.exposed = True


cherrypy.quickstart(Root())
Aufruf:

Code: Alles auswählen

http://localhost:8080/get_image?imagename=kaetzchen.jpg&username=aaa&password=bbb
Außerdem kann CherryPy gleichzeitig auch als XMLRPC-Server für die normalen RPC-Aufrufe verwendet werden.

So könnte dann der Server aussehen:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import cherrypy
from cherrypy.lib.static import serve_file
from cherrypy._cptools import XMLRPCController


class Root(object):
    
    def get_image(self, imagename, username, password):
        if username == "aaa" and password == "bbb":
            return serve_file(r"H:\GEROLD\Bilder und Videos\%s" % imagename)
        else:
            return "nix da..."
    get_image.exposed = True


class XmlRpc(XMLRPCController):

    def xmlrpctest(self, text):
        return {"text": text}
    xmlrpctest.exposed = True


def main():
    # Tree zusammensetzen
    root = Root()
    root.xmlrpc = XmlRpc()
    # Starten
    cherrypy.quickstart(root)


if __name__ == "__main__":
    main()
Der XMLRPC-Client:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import socket
socket.setdefaulttimeout(3) # Timeout auf 3 sec. setzen
import xmlrpclib

server = xmlrpclib.ServerProxy("http://localhost:8080/xmlrpc/")
print server.xmlrpctest("Servus")
Der Image-Download:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import urllib2
import urllib


URL = "http://localhost:8080/get_image"
data = {
    "imagename": "kaetzchen.jpg",
    "username": "aaa",
    "password": "bbb"
}
data = urllib.urlencode(data)

dest = file("kaetzchen.jpg", "wb")
dest.write(urllib2.urlopen(URL, data).read())
dest.close()
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

veers hat geschrieben:
Y0Gi hat geschrieben:JSON-RPC gibt es. Implementierungen sind mir so nicht bekannt, kann man möglicherweise aber selbst zusammenkombinieren.
Löst das Problem mit den Files/Streams aber auch nicht. ;)
Hab' ich ja gar nicht bestritten :)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

droptix hat geschrieben:Gibt's für Python noch andere RPC-Ansätze als XML-RPC?
Ja, eine Menge :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

auch wenn der Thread zwei Monate her ist:

@Leonidas:
du solltest den Spyro-Link mal updaten. Google spuckte mir dazu http://lsc.fie.umich.mx/~sadit/spyro/spyro.html aus.
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

nkoehring hat geschrieben:du solltest den Spyro-Link mal updaten. Google spuckte mir dazu http://lsc.fie.umich.mx/~sadit/spyro/spyro.html aus.
Oh, tatsächlich. Habe ich korrigiert, danke.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten