Keyserver - Dateienaustausch und Abruf
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
...Vorsicht!
Ich hatte in den Beispielen die Funktion ``hash`` überschrieben. Das kann zu unerwarteten Ergebnissen führen. ``hash`` wurde nach ``hashval`` ausgebessert.
lg
Gerold
Ich hatte in den Beispielen die Funktion ``hash`` überschrieben. Das kann zu unerwarteten Ergebnissen führen. ``hash`` wurde nach ``hashval`` ausgebessert.
lg
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
wow, ich bin überwältigt. shelve hatte ich mir vorher gar nicht so genau angeschaut, aber ich denke, dass ich damit arbeiten werde. danke für deinen mühen, ist ja nicht gerade wenig code, den du da gepostet hast.
hallo,
also ich habe jetzt soweit shelve mit eingebunden, und n bisschen mit rumgespielt. Problem: ich kann aufm server ohne probleme drauf zugreifen, set_keys, itervalues geht, ... sobald ich aber die methode itervalues vom Client aufrufe, gibt es ein
Exceptions.NameError:global name "keys" is not defined"
jemand eine Idee? Falls ich den Code noch posten soll, bitte melden
Danke
also ich habe jetzt soweit shelve mit eingebunden, und n bisschen mit rumgespielt. Problem: ich kann aufm server ohne probleme drauf zugreifen, set_keys, itervalues geht, ... sobald ich aber die methode itervalues vom Client aufrufe, gibt es ein
Exceptions.NameError:global name "keys" is not defined"
jemand eine Idee? Falls ich den Code noch posten soll, bitte melden
Danke
hmm.. also den oberen fehler hab ich beseitigt, jetzt aber dies hier:
exceptions.TypeError: cannot marshal None unless allow_none is enabled
Client
server.listAllKeys funktioniert übrigens, nur das abspeichern nicht
Server
Hab natürlich beides sehr abgespeckt, aber man sollte daraus erkennen wo es hängt. Muss ich die Daten vom Client anders an den Server übergeben?
Danke und Gruß
Christian
exceptions.TypeError: cannot marshal None unless allow_none is enabled
Client
Code: Alles auswählen
server.saveKey("rsa", "bla", "blub" "chris" "localhost")
Server
Code: Alles auswählen
class KeyDepot(object):
def set_key(self, algo, key, hashval, name, host)
self._shelve[str(key) = Key(algo, key, hashval, name, host)
class XMLRPCHandler:
def listAllKeys(self):
for key in keys.itervalues():
return key.algo, key.key, key.hashval, key.name, key.host
def saveKey(self, algo, key, hashval, name, host):
keys.set_key(algo, key, hashval, name, host)
def main():
# testdaten
keys.set_key("rsa", "w32", "999", "chris", "local")
if __name__=="__main__":
keys = KeyDepot(FILENAME)
main()
Danke und Gruß
Christian
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hi Christian!dankegut hat geschrieben:Code: Alles auswählen
class KeyDepot(object): def set_key(self, algo, key, hashval, name, host) self._shelve[str(key) = Key(algo, key, hashval, name, host)
Also diese Zeile ist garantiert falsch:
Code: Alles auswählen
self._shelve[str(key) = Key(algo, key, hashval, name, host)
Im Traceback steht in welcher Zeile, welche vorherigen Aufrufe stattfanden usw.
Fakt ist, dass Shelve kein None speichern will. Also musst du prüfen, was an Shelve übergeben wird. Offensichtlich wird nicht das an Shelve übergeben, was du erwartest, übergeben zu haben. Vielleicht hängt es schon daran, dass Werte falsch übergeben wurden... Erstelle zuerst die Klasseninstanz für den Key, schau dir an, was da drinnen steht und übergib diese Instanz dann an Shelve. So könntest du den Fehler entdecken.
mfg
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
hallo nochmal,
also bei vorherigen beispiel hab ich die daten ja mit in der methode übergeben und es hat nicht geklappt. Jetzt erstelle ich ein kleines dict im client so:
in der server.py
steht nur das um die ausgabe zu überprüfen. Ich bekomme in der Console vom Server auch eine korrekte Ausgabe aber der Client bricht wie folgt danach ab:
Threads started
Exception in thread Thread-1:
Traceback (most recent call last):
File "threading.py", line 442, in __bootstrap
self.run()
File "client_xml.py", line 42, in run
print server.sendKey(key)
File "xmlrpclib.py", line 1096, in __call__
return self.__send(self.__name, args)
File "xmlrpclib.py", line 1383, in __request
verbose=self.__verbose
File "xmlrpclib.py", line 1147, in request
return self._parse_response(h.getfile(), sock)
File "xmlrpclib.py", line 1286, in _parse_response
return u.close()
File "xmlrpclib.py", line 744, in close
raise Fault(**self._stack[0])
Fault: <Fault 1: 'exceptions.TypeError:cannot marshal None unless allow_none is enabled'>
Fertig
Ich kriegs auch so irgendwie nicht gebacken, vorallem weil das shelve ja gar nicht angefasst wird. Geb ich das dict auf dem Server falsch aus?! Ich krieg den Fehler nicht behoben
Jemand eine Idee??
Gruß
Christian
also bei vorherigen beispiel hab ich die daten ja mit in der methode übergeben und es hat nicht geklappt. Jetzt erstelle ich ein kleines dict im client so:
Code: Alles auswählen
key = {
"algo": "el-gamal",
"key" : "23234234234234323423423x0",
"hashval": "000111",
"name": "chris",
"host": "localhost"
}
server.sendKey(key)
Code: Alles auswählen
def sendKey(self, key_dict):
print key_dict.values()
Threads started
Exception in thread Thread-1:
Traceback (most recent call last):
File "threading.py", line 442, in __bootstrap
self.run()
File "client_xml.py", line 42, in run
print server.sendKey(key)
File "xmlrpclib.py", line 1096, in __call__
return self.__send(self.__name, args)
File "xmlrpclib.py", line 1383, in __request
verbose=self.__verbose
File "xmlrpclib.py", line 1147, in request
return self._parse_response(h.getfile(), sock)
File "xmlrpclib.py", line 1286, in _parse_response
return u.close()
File "xmlrpclib.py", line 744, in close
raise Fault(**self._stack[0])
Fault: <Fault 1: 'exceptions.TypeError:cannot marshal None unless allow_none is enabled'>
Fertig
Ich kriegs auch so irgendwie nicht gebacken, vorallem weil das shelve ja gar nicht angefasst wird. Geb ich das dict auf dem Server falsch aus?! Ich krieg den Fehler nicht behoben
Jemand eine Idee??
Gruß
Christian
Gib doch mal direkt nach dem versenden beim Client etwas mit ``print`` aus um zu sehen ob der Aufruf noch korrekt zurückkehrt.
nein, hab direkt nach
server.sendKey(key)
eine print anweisung gemacht. Diese wird nicht mehr ausgegeben, also er bricht bei der sendKey Methode komplett ab :/
server.sendKey(key)
eine print anweisung gemacht. Diese wird nicht mehr ausgegeben, also er bricht bei der sendKey Methode komplett ab :/
schreib da einfach noch ein return 'OK' rein.dankegut hat geschrieben: in der server.pyCode: Alles auswählen
def sendKey(self, key_dict): print key_dict.values()
Der Traceback sagt Dir doch eigentlich schon, daß die xmlrpclib bei _parse_response, also dem Aufarbeiten der Antwort Deines serverseitigen calls das Problem hat 'Nichts' nur zurück an den Client senden zu können, wenn Du explizit allow_none = True setzt.
Gleiches gilt übrigens auch für einen call seitens des Clients ohne Parameter.
Ciao,
dev
danke, das wars. Ich glaub da wär ich trotz des Tracebacks nicht so schnell drauf gekommen.
Gruß
Christian
Gruß
Christian
Da Du immer gesagt hast beim Client käme der Fehler, habe ich an die Möglichkeit auch nicht gedacht.
Hast Du beide Programme in der gleichen Konsole gestartet? Wenn man beide in unterschiedlichen startet, sieht man schneller wer da mit Ausnahmen um sich wirft.
Hast Du beide Programme in der gleichen Konsole gestartet? Wenn man beide in unterschiedlichen startet, sieht man schneller wer da mit Ausnahmen um sich wirft.
Nee, ich hatte es schon in 2 verschiedenen Consolen laufen. Es war übrigens genau der gleiche Fehler den ich vorher auch schonmal hatte Jetzt aber zu einem weiteren Problem.
Es funktionieren soweit alle Methoden, keys speichern einen abrufen, suchen nach versch. Kriterien, keine doppelte Speicherung usw.
Das einzige was ich nicht so ganz hinbekomme, ist die Funktion listAllKeys(), wie der Name schon sagt, möchte ich alle Keys auslesen und an den Client senden:
Implementation:
server.py
client.py
er gibt mir aber nur den ersten key in der liste aus. Man könnte ja erst alle in eine Datei schreiben und dann übergeben, find ich aber nicht so elegant.
Hat da jemand vielleicht noch eine andere Idee??
Danke und Gruß
Christian
Es funktionieren soweit alle Methoden, keys speichern einen abrufen, suchen nach versch. Kriterien, keine doppelte Speicherung usw.
Das einzige was ich nicht so ganz hinbekomme, ist die Funktion listAllKeys(), wie der Name schon sagt, möchte ich alle Keys auslesen und an den Client senden:
Implementation:
server.py
Code: Alles auswählen
def listAllKeys(self):
for key in keys.itervalues():
return key.algo, key.key, key.hashval, key.name, key.host
Code: Alles auswählen
print server.listAllKeys()
Hat da jemand vielleicht noch eine andere Idee??
Danke und Gruß
Christian
``return`` beendet eine Funktion und gibt den Ausdruck als Rückgabewert. Kein Wunder das das nur einmal ausgeführt wird.
Gibst Du da alles einzeln an, was in so einem Key steckt? Kannst Du nicht einfach ``return self.keys.items()`` statt der Schleife schreiben?
Ansonsten wirst Du in einer Schleife erst eine Ergebnisliste erstellen müssen und diese nach der Schleife mit ``return`` zurückgeben.
Gibst Du da alles einzeln an, was in so einem Key steckt? Kannst Du nicht einfach ``return self.keys.items()`` statt der Schleife schreiben?
Ansonsten wirst Du in einer Schleife erst eine Ergebnisliste erstellen müssen und diese nach der Schleife mit ``return`` zurückgeben.
ich hab jetzt mal ne testmethode eingefügt
diese wird intern im server über die methode
listAllKeys()
aufgerufen einfach mit:
return keys.test()
testdaten:
keys.set_key("rsa", "w23", "999", "chris", "localhost")
keys.set_key("el-gamal", "h2213", "111", "martin", "192.168.0.1")
keys.set_key("idea", "f234", "222", "miri", "192.168.0.2")
keys.set_key("rsa", "wef22", "333", "geo", "192.168.0.3")
ausgabe am client:
['w23', 'h2213', 'f234', 'wef22']
schonmal nicht schlecht, aber leider nur die "keys" an sich. Ich würd gern alles haben
wenn ich die testmethode mit
return self._shelve.items()
änder, bekomm ich am client
Fault: <Fault 1: "exceptions.TypeError:cannot marshal <class '__main__.Key'> objects">
hmmm... *grübel* ideen?
[/code]
Code: Alles auswählen
def test(self):
return self._shelve.keys()
listAllKeys()
aufgerufen einfach mit:
return keys.test()
testdaten:
keys.set_key("rsa", "w23", "999", "chris", "localhost")
keys.set_key("el-gamal", "h2213", "111", "martin", "192.168.0.1")
keys.set_key("idea", "f234", "222", "miri", "192.168.0.2")
keys.set_key("rsa", "wef22", "333", "geo", "192.168.0.3")
ausgabe am client:
['w23', 'h2213', 'f234', 'wef22']
schonmal nicht schlecht, aber leider nur die "keys" an sich. Ich würd gern alles haben
wenn ich die testmethode mit
return self._shelve.items()
änder, bekomm ich am client
Fault: <Fault 1: "exceptions.TypeError:cannot marshal <class '__main__.Key'> objects">
hmmm... *grübel* ideen?
[/code]
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hi dankegut!dankegut hat geschrieben:Fault: <Fault 1: "exceptions.TypeError:cannot marshal <class '__main__.Key'> objects">
XML-RPC ist ein Protokoll, mit dem Daten zwischen den verschiedensten Programmiersprachen ausgetauscht werden können. Damit das so einfach funktioniert, können keine komplexe Datentypen ausgetauscht werden.
Du kannst einen String, eine Zahl, Listen, Dictionaries, Datum und Binärdaten zurück geben. Alles andere ist Tabu.
Was die die oben aufgezeigte Meldung sagen will, ist dass du kein Objekt vom Typ "Key" zurück geben kannst.
Lösung: Wandle zuerst die Daten in eine der oben genannten Datentypen (Liste, Dictionary) um und gib die Daten dann zurück.
Siehe: http://docs.python.org/lib/module-xmlrpclib.html
mfg
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
ah.. ja da war was mit den bestimmten datentypen. ich habs jetzt so gelöst.
und es klappt, nur so zur info
Code: Alles auswählen
def listAllKeys(self):
tmp = ''
for key in keys.itervalues():
tmp += str([key.algo, key.key, key.hashval, key.name, key.host]) + "\n"
bintmp = xmlrpclib.Binary(tmp)
return bintmp
Hi gerold!
Ich würde das nicht so umständlich machen sondern gleich ein "IF EXIST" einbauen. So wird die Tabelle dann nur erzeugt wenn sie auch existiert.
Hier die geändeerte Version: Funktioniert 100%ig, wiel ich meine Tabellen auch mit "IF EXIST" so erzeuge
lg
xtra
P.S.: Das hat neben der kürzeren Schreibweise noch den vorteil das ein Query weniger erzeugt werden muss.
EDIT: Falsche Einrückung von mir korrigiert.
Ich würde das nicht so umständlich machen sondern gleich ein "IF EXIST" einbauen. So wird die Tabelle dann nur erzeugt wenn sie auch existiert.
Code: Alles auswählen
def create_dbstructure(self):
"""
Erstellt die Tabellen
"""
cur = self.cur
conn = self.conn
# keys-Tabelle erstellen, falls noch nicht erstellt.
sql = """
SELECT name FROM sqlite_master
WHERE (type = 'table') AND (name = 'keys')
"""
cur.execute(sql)
if not self.cur.fetchone():
# Die Tabelle existiert noch nicht. Sie kann erstellt werden.
sql = """
CREATE TABLE keys (
key TEXT PRIMARY KEY NOT NULL,
algo TEXT,
name TEXT,
hashval TEXT
)
"""
cur.execute(sql)
# Index(e) erstellen
sql = """
SELECT name FROM sqlite_master
WHERE (type = 'index') AND (name = 'i_keys_algo')
"""
cur.execute(sql)
if not cur.fetchone():
sql = "CREATE INDEX i_keys_algo ON keys (algo)"
cur.execute(sql)
conn.commit()
Code: Alles auswählen
def create_dbstructure(self):
"""
Erstellt die Tabellen
"""
cur = self.cur
conn = self.conn
# Erstellt die Tabelle falls sie noch nicht existiert.
# Dies wird durch die Abfrage IF EXIST erreicht die glücklicherweise
# auch in SQLite funktioniert :)
sql = """
CREATE TABLE IF NOT EXISTS keys (
key TEXT PRIMARY KEY NOT NULL,
algo TEXT,
name TEXT,
hashval TEXT
)
"""
cur.execute(sql)
# Index(e) erstellen
sql = """
SELECT name FROM sqlite_master
WHERE (type = 'index') AND (name = 'i_keys_algo')
"""
cur.execute(sql)
if not cur.fetchone():
sql = "CREATE INDEX i_keys_algo ON keys (algo)"
cur.execute(sql)
conn.commit()
xtra
P.S.: Das hat neben der kürzeren Schreibweise noch den vorteil das ein Query weniger erzeugt werden muss.
EDIT: Falsche Einrückung von mir korrigiert.
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hi XtraNine!XtraNine hat geschrieben:Ich würde das nicht so umständlich machen sondern gleich ein "IF EXIST" einbauen.
Wenn es bei dir funktioniert, dann ist das korrekt. Leider funktioniert es bei vielen noch nicht. Deshalb habe ich es im Beispiel nicht verwendet.
Hier die Begründung: http://gelb.bcom.at/trac/misc/browser/s ... sdb.py#L79
lg
Gerold
PS: Und jetzt gehe ich wieder ins Bett, meine Grippe ausschlafen.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Hi Gerold
Ich danke dir! Das wusste ich nicht Ich werde in meinen Programm das auch ändern, damit es mit älteren Versionen von SQLite kompatibel ist.
lg
Ich danke dir! Das wusste ich nicht Ich werde in meinen Programm das auch ändern, damit es mit älteren Versionen von SQLite kompatibel ist.
Wünsch dir eine gute BesserungPS: Und jetzt gehe ich wieder ins Bett, meine Grippe ausschlafen.
lg