[solved] WSGI ohne Framework POST Formulardaten auslesen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Jorn
User
Beiträge: 13
Registriert: Donnerstag 16. August 2007, 10:08

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
Zuletzt geändert von Jorn am Sonntag 19. August 2007, 11:45, insgesamt 4-mal geändert.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Jorn
User
Beiträge: 13
Registriert: Donnerstag 16. August 2007, 10:08

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
Zuletzt geändert von Jorn am Samstag 18. August 2007, 18:43, insgesamt 5-mal geändert.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Hm also das erste was mir auffällt ist das "is_post_request" nicht definiert ist ;)
Jorn
User
Beiträge: 13
Registriert: Donnerstag 16. August 2007, 10:08

:oops:..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
Zuletzt geändert von Jorn am Samstag 18. August 2007, 18:43, insgesamt 1-mal geändert.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Zum testen kannst du den Aufruf ja mal in hello_world stecken ;)
Jorn
User
Beiträge: 13
Registriert: Donnerstag 16. August 2007, 10:08

Da kommt immer noch nichts an ??

Danke für die Geduld,

Jorn
Zuletzt geändert von Jorn am Sonntag 19. August 2007, 11:36, insgesamt 3-mal geändert.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

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 ;)
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Warum willst du das so low-level machen und benutzt keine fertige, getestete, einfach benutzbare Abstraktion?
Jorn
User
Beiträge: 13
Registriert: Donnerstag 16. August 2007, 10:08

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
Zuletzt geändert von Jorn am Sonntag 19. August 2007, 11:37, insgesamt 1-mal geändert.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

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.
Jorn
User
Beiträge: 13
Registriert: Donnerstag 16. August 2007, 10:08

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
Zuletzt geändert von Jorn am Sonntag 19. August 2007, 11:41, insgesamt 1-mal geändert.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

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.
Jorn
User
Beiträge: 13
Registriert: Donnerstag 16. August 2007, 10:08

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
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

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.
Jorn
User
Beiträge: 13
Registriert: Donnerstag 16. August 2007, 10:08

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Jorn
User
Beiträge: 13
Registriert: Donnerstag 16. August 2007, 10:08

..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
Antworten