[solved] WSGI ohne Framework POST Formulardaten auslesen

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

Freitag 17. August 2007, 19:33

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:

Freitag 17. August 2007, 19:49

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

Freitag 17. August 2007, 20:46

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:

Freitag 17. August 2007, 21:59

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

Samstag 18. August 2007, 09:58

: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:

Samstag 18. August 2007, 12:57

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

Samstag 18. August 2007, 13:32

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:

Samstag 18. August 2007, 15:25

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

Samstag 18. August 2007, 16:29

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

Samstag 18. August 2007, 18:48

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:

Samstag 18. August 2007, 20:03

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

Samstag 18. August 2007, 22:02

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:

Sonntag 19. August 2007, 11:28

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

Sonntag 19. August 2007, 11:39

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

Montag 20. August 2007, 12:45

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