Seite 1 von 1
[solved] WSGI ohne Framework POST Formulardaten auslesen
Verfasst: Freitag 17. August 2007, 19:33
von Jorn
Hallo Forum,
Für einen (sehr) kleinen lokalen Testserver hab ich versucht den WSGI-Demoserver anzupassen.
Nur beim Zugriff auf Formulardaten komm ich einfach nicht weiter.
Ich habs mit dem CGI-Modul versucht,
mit den WSGI-Bordmitteln..
..aber ich kriegs einfach nicht hin..
Danke im vorraus,
Jorn
Verfasst: Freitag 17. August 2007, 19:49
von veers
Verfasst: Freitag 17. August 2007, 20:46
von Jorn
Hallo veers,
Danke für die schnelle Hilfe.
Ich hab mal
eingebaut..
Was muss ich jetzt noch ändern ?
( Im "handle_request" habs ichs nicht hinbekommen )
Danke,
Jorn
Verfasst: Freitag 17. August 2007, 21:59
von veers
Hm also das erste was mir auffällt ist das "is_post_request" nicht definiert ist

Verfasst: Samstag 18. August 2007, 09:58
von Jorn

..hatte ich schon eingebaut, aber ist im Laufe der Versuche wohl abhanden gekommen..
Ich hab den Code mal geändert (s.u.).
Ich weiss nur einfach nicht wo ich "get_post_form" feuern soll..
( damit auch was ankommt )
Danke,
Jorn
Verfasst: Samstag 18. August 2007, 12:57
von veers
Zum testen kannst du den Aufruf ja mal in hello_world stecken

Verfasst: Samstag 18. August 2007, 13:32
von Jorn
Da kommt immer noch nichts an ??
Danke für die Geduld,
Jorn
Verfasst: Samstag 18. August 2007, 15:25
von veers
get_post_form(environ) << du verwirfst den Rückgabewert ja auch, das wäre deine cgi.FieldStorage
Aber mal einen Tip: Wenn du so Probleme damit hast, fang doch mit einem Framework an, ist einfacher

Verfasst: Samstag 18. August 2007, 16:29
von Y0Gi
Warum willst du das so low-level machen und benutzt keine fertige, getestete, einfach benutzbare Abstraktion?
Verfasst: Samstag 18. August 2007, 18:48
von Jorn
Ok,
Hab den Rückgabewert jetzt mal reingeschrieben (s.u.),
da kommt nach wie vor nichts an.
Ich vermutete das ..
Code: Alles auswählen
environ['wsgi.post_form'] = post_form
environ['wsgi.input'] = new_input
..mir das ganze sowieso in die "environ" speichern würde .. ???
Zu den Frameworks:
Mir gefiel der Gedanke einen portablen, lokalen
Miniserver in einem Skript unterzubringen..
..welches dann auch nicht die Installation eines Frameworks vorraussetzt.
Ich benötige weder Templates noch Javaskript/AJAX,
Cookies, Sessions, Externe Server .. was auch immer
und fände es auch praktischer wenn so ein Framework auf einem anderen Rechner
nicht erst installiert werden müsste.
Für meine Zwecke würde das Ganze ja schon völlig reichen,
es muss eben nur noch die Sache mit den Formularen funktionieren..
(maximal vielleicht noch ein Dateiupload)
@YOGI:
Meinst Du mit der Abstraktion ein Framework ?
(Wenn Nein - Was dann ?)
Danke,
Jorn
Verfasst: Samstag 18. August 2007, 20:03
von veers
Grundsätzlich kannst du auch ein Webframework in ein einzelnes Egg verpacken. Schau dir doch mal web.py an

Das ist ein minimalistischer Ansatz welcher dir die grundsätzlichen Probleme löst.
Verfasst: Samstag 18. August 2007, 22:02
von Jorn
Hallo und Danke nochmal,
hab mir soeben web.py runtergeladen und mal ein Beipiel mit Formular zum Laufen gebracht.
Obwohl "minimalistisch" sind das dennoch einige Dateien unter /web ..
( wobei ich mich auch frage ob der mir fehlende Teil nun in CherryPy oder einer der anderen Dateien steckt.. ? )
Werd´ das mal weiter durchprobieren.
Zu dem EGG:
Dann müsste ich´s ja entpacken bevor ich editieren kann, oder ?
Jorn
Verfasst: Sonntag 19. August 2007, 11:28
von veers
Jaein, es ist grundsätzlich möglich einzelne Dateien in einem ZIP zu bearbeiten. Wie das dann mit der Fragmentation etc. aussieht weis ich nicht. Aber du musst ja nicht alles in Eggs verpacken, nur die Libraries, der eigentliche Code kann ja auch ausserhalb sein.
Verfasst: Sonntag 19. August 2007, 11:39
von Jorn
OK,
habs endlich hinbekommen.
Hier also das fertige Skript:
Code: Alles auswählen
# -*- coding: cp1252 -*-
from wsgiref.simple_server import ServerHandler, WSGIRequestHandler, make_server, WSGIServer
from wsgiref.handlers import *
from wsgiref.util import *
from BaseHTTPServer import *
import urllib, sys
import cgi
def hello_world(environ, start_response):
def get_post_form(environ):
if (environ['REQUEST_METHOD'].upper() == 'POST'):
input = environ['wsgi.input']
post_form = environ.get('wsgi.post_form')
if (post_form is not None
and post_form[0] is input):
return post_form[2]
environ.setdefault('QUERY_STRING', '') # This must be done to avoid a bug in cgi.FieldStorage
fs = cgi.FieldStorage(fp=input, environ=environ, keep_blank_values=1)
new_input = InputProcessed()
post_form = (new_input, input, fs)
environ['wsgi.post_form'] = post_form
environ['wsgi.input'] = new_input
test = post_form[1]
return fs
class InputProcessed(object):
def read(self, *args):
raise EOFError('The wsgi.input stream has already been consumed')
readline = readlines = __iter__ = read
get_post_form(environ)
sektion = ""
sektion = shift_path_info(environ)
out = ""
# Startseite
if sektion == "":
out += "<title>PostForm</title>\n\n"
out += '\t<form method="post" action="receiver.htm" name="postform" enctype="application/x-www-form-urlencoded">\n'
out += '\t\t<input type=text name="formtext1"><br>\n'
out += '\t\t<input type=text name="formtext2"><br>\n'
out += '\t\t<input type=submit name="bsenden" value=senden>\n'
out += "\t</form>"
start_response('200 OK', [('Content-Type', 'text/html')])
return [out]
elif sektion == "receiver.htm":
form = environ.get('wsgi.post_form')
out += "<title>Receiver</title>\n\n"
out += str(form)
start_response('200 OK', [('Content-Type', 'text/html')])
return [out]
print "Starte Server"
srv = make_server('', 80, hello_world, WSGIServer, WSGIRequestHandler)
import webbrowser
webbrowser.open('http://localhost:80/')
srv.handle_request(); srv.handle_request();
# srv.serve_forever()
print "Server Runtergefahren"
Nochmal vielen Dank für die Hilfe !
Jorn
Verfasst: Montag 20. August 2007, 12:45
von Y0Gi
Mit Abstraktion meine ich die Verwendung einer bestehenden Bibliothek, die die eigentliche Implementierung der WSGI-Schnittstelle für dich übernommen hat. In der Regel hast du dann Klassen für Request und Response, über die du dann Ein- und Ausgabe deiner Anwendung ansprechen kannst.
Da wäre z.B.
Paste, das allerdings einen ganzen Haufen Sachen mitbringt, die du alleine dafür möglicherweise bei weitem nicht benötigst. Deutlich schlanker ist da blackbirds
Werkzeug, das aber leider noch nicht im Käseladen verfügbar ist *HINT, HINT*.
Möglicherweise ideal ist
WebOb, eine Extraktion und Weiterentwicklung/Verbesserung eben genau der Request- und Response-Klassen aus Paste. Werde mir das auf jeden Fall genauer ansehen.
Verfasst: Montag 20. August 2007, 13:54
von Leonidas
Y0Gi hat geschrieben:Werkzeug, das aber leider noch nicht im Käseladen verfügbar ist *HINT, HINT*.
Was aber daran liegt, dass es kein offizielles Release gibt. Wenn es denn eines geben wird, dann kommt das sicher rein.
Apropos, Der Käseladen heißt nun wieder pippi... ähh, PyPI. Schade eigentlich.
Verfasst: Montag 20. August 2007, 16:25
von Y0Gi
Leonidas hat geschrieben:Y0Gi hat geschrieben:Werkzeug, das aber leider noch nicht im Käseladen verfügbar ist *HINT, HINT*.
Was aber daran liegt, dass es kein offizielles Release gibt. Wenn es denn eines geben wird, dann kommt das sicher rein.
Genau darum geht es ja: Ein Release.
Verfasst: Montag 20. August 2007, 16:46
von Jorn
Hallo,
erstmal Danke für die Links - die werd´ ich mir mal genauer ansehen.
(Vielleicht setz ich ja doch noch einen "richtigen" Server auf..)
Dank veers Hinweis mit der FieldStorage klappte der Dateiupload dann auch auf Anhieb,
interessanterweise bis ~ 40 Mb ( was mehr als genug ist ).
Das mit dem Cheeseshop klingt interessant,
als Python-Neuling bin ich über den Ausdruck auch schon ein paarmal gestolpert,
was hat der Name denn für einen Hintergrund ?
Jorn
Verfasst: Montag 20. August 2007, 22:54
von Leonidas
Jorn hat geschrieben:Das mit dem Cheeseshop klingt interessant,
als Python-Neuling bin ich über den Ausdruck auch schon ein paarmal gestolpert,
was hat der Name denn für einen Hintergrund ?
Der kommt aus einem Skech von Monty Python (Cheese Shop), wo ein Kunde in einen Käseladen geht in dem es keinen Käse gibt. Kannst ihn dir mal auf YouTube ansehen. Der Witz an der Sache war, dass in PyPI anfangs auch keine Pakete waren, die sind erst dort drin, seit setuptools und easy_install so populär geworden sind (was zum Teil sicherlich ein Verdienst von TG und Pylons war, die man ohne nur schwer installieren kann ohne etwas zu vergessen).
Verfasst: Dienstag 21. August 2007, 12:46
von Jorn
..beim Stichwort "Monthy Python" quillt das ja fast über *lol*.
"The cats eat it.." *rofl*
.. dann wollen wir mal hoffen das der Laden nicht dicht ist weil der Verkäufer erschossen wurde..
Ok,
schönen Dank für diesen informellen Hintergrund,
Jorn