Seite 1 von 1
_gelöst_ [wsgi cherrypy]
Verfasst: Donnerstag 29. April 2010, 10:41
von CodyJack
Hallo,
folgendes Problem, ich bin ein Pythonanfänger und hab schwierigkeiten folgenden Code zu verstehen.
Code: Alles auswählen
elif Method_s == "POST":
Input_o = environ["wsgi.input"].rfile
Content_s = Input_o._rbuf
Parameter_o = cgi.parse_qs(Content_s)
Was passiert in dem Teil wsgi.input und was ist _rbug, rfile? die Daten tauchen nirgendwo anders vorher im Code auf und in der Docu zu Python/Cherry hab ich nichts gefunden.
außerdem kommt es zu einem Absturtz in der letzten Zeile
Code: Alles auswählen
File "beispiel.py", line 111, in Newsletter_p
Parameter_o = cgi.parse_qs(Content_s)
File "/usr/lib/python2.6/cgi.py", line 185, in parse_qs
return urlparse.parse_qs(qs, keep_blank_values, strict_parsing)
File "/usr/lib/python2.6/urlparse.py", line 310, in parse_qs
for name, value in parse_qsl(qs, keep_blank_values, strict_parsing):
File "/usr/lib/python2.6/urlparse.py", line 336, in parse_qsl
pairs = [s2 for s1 in qs.split('&') for s2 in s1.split(';')]
AttributeError: 'cStringIO.StringO' object has no attribute 'split'
Geschrieben wurde der Code mit Python 2.5 soweit ich weiss, der Befehlt cgi.parse_qs ist veraltet ich hab es auch mal durch die neuen Funktionen ersetzt aber das Ergebnis blieb das selbe.
Danke
Verfasst: Donnerstag 29. April 2010, 10:57
von ms4py
Wie wäre es mit einem Kontext des Code-Ausschnitts und einer Erklärung, was du überhaupt bezwecken willst?!
Verfasst: Donnerstag 29. April 2010, 11:01
von CodyJack
Hi,
ok hier ist der komplette Code
http://pastebin.com/vu1Whn9k
es geht darum daten aus einem Formular per post auszulesen und weiter zu verarbeiten
Verfasst: Donnerstag 29. April 2010, 11:13
von Defnull
Wer auch immer diesen Code geschrieben hat, er verstößt gegen PEP8 und hat keinen Schimmer von WSGI oder HTTP an sich.
1) wsgi.input und _rbuf sind Streams, keine Strings. cgi.parse_qs erwartet aber einen String. Daher der Fehler.
2) _rbuf ist ein privates Attribut der socket._fileobject Klasse. Private Attribute von privaten Klasse zu benutzen ist schon ziemlich dreist.
3) POST daten sind nur dann in einem von cgi.parse_qs interpretierbaren Format, wenn sie mit "Content-Type: application/x-www-form-urlencoded" übertragen wurden. Das testet der Code aber gar nicht. Kommt multipart an, explodiert dein Rechner.
4) CherryPy hat Funktionen, die einem diesen ganzen Mist ab nehmen. Warum werden die nicht genutzt?
Wenn das ganze ein Lehr-Beispiel für WSGI sein soll, dann kann ich verstehen, warum die CherryPy Features nicht genutzt werden. Aber wozu dann überhaupt CherryPy? Python hat einen WSGI Server eingebaut.
Verfasst: Donnerstag 29. April 2010, 11:13
von ms4py
CodyJack hat geschrieben:Hi,
ok hier ist der komplette Code
http://pastebin.com/vu1Whn9k
es geht darum daten aus einem Formular per post auszulesen und weiter zu verarbeiten
Vergiss diesen Quelltext, der ist Müll. Mach das selber und verwende ein entsprechendes Framework (bottle/flask für einfache Anwendungen) oder die Funktionen, die von `CherryPy`schon zur Verfügung stehen.
Verfasst: Donnerstag 29. April 2010, 11:50
von CodyJack
Vielen Dank für die ausführliche Antwort,
ja es geht eine Lernaufgabe, klingt recht böse was du da zu sagst *g*
wieso wir den von cherrypy nehmen sollen weiss ich auch nicht und nein wir sollen ansonstne nich mit cherry arbeiten, geht wie schon erkannt hast darum mit cgi umzugehen
Gruß
Cody
Defnull hat geschrieben:Wer auch immer diesen Code geschrieben hat, er verstößt gegen PEP8 und hat keinen Schimmer von WSGI oder HTTP an sich.
1) wsgi.input und _rbuf sind Streams, keine Strings. cgi.parse_qs erwartet aber einen String. Daher der Fehler.
2) _rbuf ist ein privates Attribut der socket._fileobject Klasse. Private Attribute von privaten Klasse zu benutzen ist schon ziemlich dreist.
3) POST daten sind nur dann in einem von cgi.parse_qs interpretierbaren Format, wenn sie mit "Content-Type: application/x-www-form-urlencoded" übertragen wurden. Das testet der Code aber gar nicht. Kommt multipart an, explodiert dein Rechner.
4) CherryPy hat Funktionen, die einem diesen ganzen Mist ab nehmen. Warum werden die nicht genutzt?
Wenn das ganze ein Lehr-Beispiel für WSGI sein soll, dann kann ich verstehen, warum die CherryPy Features nicht genutzt werden. Aber wozu dann überhaupt CherryPy? Python hat einen WSGI Server eingebaut.
Verfasst: Donnerstag 29. April 2010, 12:12
von BlackJack
@CodyJack: CGI? Dann brauchst Du erst recht kein `cherrypy`, denn dann solltest Du auch keinen WSGI-Server verwenden.
Die Namensgebung ist gruselig. Was sollen die ganzen Postfixe wie `_o`, `_s`, `_spl`? Doch wohl hoffentlich nicht den Typ der Objekte anzeigen? Das ist bei `_o` falls das für "Objekt" stehen soll besonders sinnlos weil in Python *alles* was man an einen Namen binden kann, ein Objekt ist. Und die `_p`\s bei den Funktionen!?
Zum Konkreten Problem: Lies Dir Dokumentation über CGI und/oder WSGI durch.
Und wenn Du den Inhalt von einem Dateiähnlichen Objekt haben möchtest, dann wühl da nicht in den Innerereien des konkreten Objekts herum, sondern lies den Inhalt aus, wie man das bei geöffneten Dateien halt macht.
Verfasst: Donnerstag 29. April 2010, 12:38
von CodyJack
sorry falsch ausgedrückt wsgi meint ich , als Objekt muss ich es wohl haben denk ich, wir sollen es mit einem Dict verarbeiten und mittels prickel speichern
edit:
@defnull
hm wenn ich nach urlencoded prüfe wird mir nur die datei zum download angeboten danach aber nicht verarbeitet
Verfasst: Donnerstag 29. April 2010, 13:00
von ms4py
Verfasst: Donnerstag 29. April 2010, 13:41
von DasIch
BlackJack hat geschrieben:Und die `_p`\s bei den Funktionen!?
Steht wahrscheinlich für predicate.
Verfasst: Donnerstag 29. April 2010, 13:53
von CodyJack
Verfasst: Donnerstag 29. April 2010, 14:25
von BlackJack
@DasIch: Würde aber keinen Sinn machen!? Ich hätte eher auf "Prozedur"/"procedure" getippt. Aber das wir uns das jetzt fragen ist eine schöne Bestätigung dafür dass man von sochen Prä- oder Postfixen Abstand nehmen sollte. Das Programm wird dadurch nicht klarer oder verständlicher, eher im Gegenteil.
Verfasst: Donnerstag 29. April 2010, 14:28
von DasIch
BlackJack hat geschrieben:@DasIch: Würde aber keinen Sinn machen!?
Naja, es ist ungarische Notation, was erwartest du?
Verfasst: Donnerstag 29. April 2010, 17:31
von CodyJack
aber mir ist immer noch nicht ganz klar wie ich nun das post des forms auslese, ich dachte eventuell mit urlparse.parse_qs aber scheint sich ja wirklich nur auf urls zu beziehen? Jedenfalls ist mein Dict leer wenn ich es ausgebe
Verfasst: Donnerstag 29. April 2010, 23:11
von ms4py
CodyJack hat geschrieben:aber mir ist immer noch nicht ganz klar wie ich nun das post des forms auslese, ich dachte eventuell mit urlparse.parse_qs aber scheint sich ja wirklich nur auf urls zu beziehen? Jedenfalls ist mein Dict leer wenn ich es ausgebe
Darfst du denn kein Framework verwenden? Ist IMO eine sinnfreie Aufgabe sich da mit rohem WSGI auseinanderzusetzen.
Verfasst: Freitag 30. April 2010, 05:24
von CodyJack
nein ichdarf kein framework nutzen, wahrscheinlich in der nächsten aufgabe mit cherrypy, naja was heisst sinnfrei, man soll sich halt mal damit abquälen um zu sehen wie es geht
edit:
http://webpython.codepoint.net/wsgi_req ... rsing_post
damit hab ich es hinbekommen

bzw ich habs mit urlparse.parse_qs gemacht nun