_gelöst_ [wsgi cherrypy]

Django, Flask, Bottle, WSGI, CGI…
Antworten
CodyJack
User
Beiträge: 7
Registriert: Donnerstag 29. April 2010, 10:33

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
Zuletzt geändert von CodyJack am Dienstag 18. Mai 2010, 10:14, insgesamt 1-mal geändert.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Wie wäre es mit einem Kontext des Code-Ausschnitts und einer Erklärung, was du überhaupt bezwecken willst?!
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
CodyJack
User
Beiträge: 7
Registriert: Donnerstag 29. April 2010, 10:33

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
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

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.
Zuletzt geändert von Defnull am Donnerstag 29. April 2010, 11:17, insgesamt 1-mal geändert.
Bottle: Micro Web Framework + Development Blog
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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.
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
CodyJack
User
Beiträge: 7
Registriert: Donnerstag 29. April 2010, 10:33

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.
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.
CodyJack
User
Beiträge: 7
Registriert: Donnerstag 29. April 2010, 10:33

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
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

BlackJack hat geschrieben:Und die `_p`\s bei den Funktionen!?
Steht wahrscheinlich für predicate.
CodyJack
User
Beiträge: 7
Registriert: Donnerstag 29. April 2010, 10:33

ms4py hat geschrieben:Ich hätte da was für dich ;)
http://ms4py.org/python_web_development.pdf
danke schön
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.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

BlackJack hat geschrieben:@DasIch: Würde aber keinen Sinn machen!?
Naja, es ist ungarische Notation, was erwartest du?
CodyJack
User
Beiträge: 7
Registriert: Donnerstag 29. April 2010, 10:33

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
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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.
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
CodyJack
User
Beiträge: 7
Registriert: Donnerstag 29. April 2010, 10:33

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
Antworten