Colubrid WSGI Request Handler 0.8

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Colubrid ist out now :-)

Bringt alles mit, was man zum WSGI entwickeln braucht:
  • Standalone Server
  • CGI Wrapper
  • 5 Anwendungstypen für so ziemlich alle Bereiche
  • Debugging System
  • URL Dispatcher
Und natürlich alles WSGI kompatibel :)

Ich hab ausnahmsweise sogar eine komplette doku geschrieben*, aber durch mein schlechtes Englisch leider sehr schlech zu lesen :oops:

Wer sich nichts unter Colubrid vorstellen kann, hier keine kleine Beispielanwendung:

Code: Alles auswählen

from colubrid import BaseApplication

class MyApplication(BaseApplication):

    def process_request(self):
        try:
            times = int(request.GET['times'])
        except:
            times = 1
        try:
            name = request.GET['name']
        except:
            name = 'Welt'
        self.request.headers['Content-Type'] = 'text/plain'
        for i in xrange(times):
            self.request.write('Hallo %s!\n' % name)
        
app = MyApplication
Zum testen kann man das ding einfach mit python starten, oder es an einen WSGI wrapper kleben. Details gibts in der Doku.

*dynamic response fehlt noch, aber es ist ein beispiel im svn repo.

//EDIT: ganz vergessen. Die Webseite selber ist mit Colubrid und Jinja umgesetzt. Den Sourcecode davon gibt es im trac.
Zuletzt geändert von mitsuhiko am Mittwoch 25. Januar 2006, 18:35, insgesamt 1-mal geändert.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

blackbird hat geschrieben://EDIT: ganz vergessen. Die Webseite selber ist mit Colubrid und Jinja umgesetzt.
Kleine Anmerkung zur Doku. Da fehlt eindeutig ein vor/zurück ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

jens hat geschrieben:
blackbird hat geschrieben://EDIT: ganz vergessen. Die Webseite selber ist mit Colubrid und Jinja umgesetzt.
Kleine Anmerkung zur Doku. Da fehlt eindeutig ein vor/zurück ;)
Ich weiß :lol: Aber da das alles nur markdown geparste Seiten sind war ich zu faul da überall manuell Buttons einzubauen. :wink:
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Also markdown fand ich irgendwie doof... Mit textile kam ich wesendlich besser zurecht ;)
Warum eigentlich keine Wiki-Seiten als Doku? Dann könnten auch andere Mitarbeiten.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

jens hat geschrieben:Also markdown fand ich irgendwie doof... Mit textile kam ich wesendlich besser zurecht ;)
Warum eigentlich keine Wiki-Seiten als Doku? Dann könnten auch andere Mitarbeiten.
Weil auch so andere da mithelfen können. Liegt ja alles im repo vor. :wink: Und markdown find ich besser implementiert als textile.
TUFKAB – the user formerly known as blackbird
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Großes Update. Ich denke das letzte vor dem neuen Release.

Jetzt bringt jede Colubrid ein komplettes Cmd Interface mit, mit dem sich Apache Configs erstellen lassen, der Webserver kann nun Code wirklich nachladen und auch statische Dateien servieren.

Beispiel für die Apache Config:

Code: Alles auswählen

blackbird@volverine:~/Developement/WSGIarea/colubrid/trunk$ python examples/webpylike.py genconfig --interface-type=cgi --vhost=www.mywebpage.tld
<VirtualHost *>
    ServerName www.mywebpage.tld
    Alias /favicon.ico /home/blackbird/Developement/WSGIarea/colubrid/trunk/static/favicon.ico
    Alias /static /home/blackbird/Developement/WSGIarea/colubrid/trunk/static
    ScriptAlias / /home/blackbird/Developement/WSGIarea/colubrid/trunk/examples/webpylike.cgi/
</VirtualHost>
TUFKAB – the user formerly known as blackbird
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

Ist James damit jetzt deprecated oder lässt du das parallel weiterlaufen?
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

henning hat geschrieben:Ist James damit jetzt deprecated oder lässt du das parallel weiterlaufen?
Läuft parallel weiter, ist aber nicht für Colubrid gedacht, weil Colubrid eben diesen schon mitbringt. Beim nächsten James Release werden die Änderungen, die in Colubrid eingepflegt wurden zurückgespielt.
TUFKAB – the user formerly known as blackbird
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Heute war update auf 0.8. Änderungen:
* support für statische dateien
* viele kleine fehler entfernt
* kann jetzt apache configs erstellen
* fehler in FILES entfernt
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Was hat es eigentlich für einen Sinn, das self.request.GET und self.request.POST ein komisches MultiDict sind???
Das doofe, bei einem self.request.echo(self.request.GET) kommt nur ein <instanz BlaBla> raus und kein nützlicheres {"BlaBla": "schnup"}

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

jens hat geschrieben:Was hat es eigentlich für einen Sinn, das self.request.GET und self.request.POST ein komisches MultiDict sind???
Das doofe, bei einem self.request.echo(self.request.GET) kommt nur ein <instanz BlaBla> raus und kein nützlicheres {"BlaBla": "schnup"}
Denk an diesen Fall:

Code: Alles auswählen

<form action="" method="post">
  <input type="text" name="coord">
  <input type="text" name="coord">
  <input type="text" name="coord">
  <input type="text" name="coord">
  <input type="text" name="coord">
  <input type="text" name="coord">
  <input type="text" name="coord">
  <input type="submit" value="Absenden" />
</form>
Wie soll er den ohne multidict die Variablen ausgeben?
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Sorry, das verstehe ich erstmal nicht... OK, man kann mehrere HTML-Form.-Felder gleich benennen...

Beim normalen CGI kommt sowas raus:

Code: Alles auswählen

FieldStorageData = cgi.FieldStorage()

data = {}
for key in FieldStorageData.keys():
    data[key] = FieldStorageData.getvalue(key)
print data

Code: Alles auswählen

{"jau":["wert1","wert2","wert3"]}
Geht also auch ohne... Nur, warum sollte es überhaupt mehrere Felder mit gleichen Namen geben???

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

jens hat geschrieben:Sorry, das verstehe ich erstmal nicht... OK, man kann mehrere HTML-Form.-Felder gleich benennen...

Beim normalen CGI kommt sowas raus:

Code: Alles auswählen

FieldStorageData = cgi.FieldStorage()

data = {}
for key in FieldStorageData.keys():
    data[key] = FieldStorageData.getvalue(key)
print data

Code: Alles auswählen

{"jau":["wert1","wert2","wert3"]}
Geht also auch ohne... Nur, warum sollte es überhaupt mehrere Felder mit gleichen Namen geben???
Ich nutze das in vielen Fällen. Und im MultiDict gibts __geitem__ immer das letzte element in der liste zurück und getlist die komplette liste für einen key.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

blackbird hat geschrieben:Ich nutze das in vielen Fällen.
Was jetzt "Multidict" oder "mehrere HTML-Felder mit gleichem Namen" ?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

jens hat geschrieben:
blackbird hat geschrieben:Ich nutze das in vielen Fällen.
Was jetzt "Multidict" oder "mehrere HTML-Felder mit gleichem Namen" ?
Ersteres mit der Prämisse, dass ich Letzteres auch tue. :wink:
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

OK, aber wo macht das Sinn??? Und reicht nicht doch ein normales Dict dafür?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Hier:

Code: Alles auswählen

def get_form(self):
    return '\n'.join('<input type="checkbox" name="delete" value="%d">' % i for i on xrange(200))
Dann hast du eine Form aus 200 Checkboxen. Und für alle angeklickten bekommst du deren IDs mit request.GET.getlist('delete').
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Nagut, einen Anwenungsfall gibt es schon... Nur, es geht wie gesagt auch mit einem normalem Dict... :lol:

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Nich zwei andere Fragen:

1.) Mit self.request.exposed.append() kann man ja Daten zum Traceback hinzufügen... Aber in welcher Form müßen die vorliegen? Dürfen es nur Dicts sein?

2.) Der Standalone-Test-Server funktioniert bei mir übers Netz erst dann, wenn bei http://wsgiarea.pocoo.org/trac/browser/ ... te.py#L342
Es nicht:

Code: Alles auswählen

self.run_standalone(options.hostname or 'localhost',
sondern:

Code: Alles auswählen

self.run_standalone("",
steht. Ist das normal???

3.) Beim starten vom standalone-Test-Server kommt es immer zu einem Traceback, aber der Server läuft:
Traceback (most recent call last):
File "PyLucid_CGI_app.py", line 106, in ?
CGIServer(app, exports).run()
File "/daten/www/testing_Server/PyLucid_WSGI/colubrid/execute.py", line 111, in run
result = self.application(environ, start_response)
File "PyLucid_CGI_app.py", line 57, in __init__
super(PyLucid, self).__init__(*args)
File "W:\testing_Server\WSGIarea\colubrid\application.py", line 64, in __init__
File "W:\testing_Server\WSGIarea\colubrid\request.py", line 35, in __init__
File "W:\testing_Server\WSGIarea\colubrid\request.py", line 53, in get_full_url
File "W:\testing_Server\WSGIarea\colubrid\utils.py", line 292, in get_full_url
KeyError: 'SERVER_NAME'
Was ich aber überhaupt nicht verstehe, wie das Windows-Pfade im Traceback rein kommen können :shock:
Also ich starte den Server unter Linux! Zwar stimmen die Pfade theoretisch, weil die als Samba Freigabe so verfügbar sind, aber irgendwie macht das keinen Sinn :?:

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Was ich aber überhaupt nicht verstehe, wie das Windows-Pfade im Traceback rein kommen können :Shocked:
Also ich starte den Server unter Linux! Zwar stimmen die Pfade theoretisch, weil die als Samba Freigabe so verfügbar sind, aber irgendwie macht das keinen Sinn
Doch. Die Pfade sind noch .pyc's die Du unter Windows kompiliert hast da drin. Lösch alle .pyc-s, und die Linux-Pfade tauchen auf.

--- Heiko.
Antworten