Bottle: Micro Web Framework

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
bankkind
User
Beiträge: 106
Registriert: Freitag 14. September 2007, 23:02
Wohnort: Teltow
Kontaktdaten:

Hallo zusammen,
kann es sein das Bottle Probleme hat mit externen CSS Dateien?
Ich habe jetzt schon versucht die CSS Datei ins Verzeichnis des Templates zu legen und auch schon in das Verzeichnis des *.py Scripts. Bekomme aber immer einen 404

Code: Alles auswählen

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head><title>Error 404: Not Found</title>
</head><body><h1>Error 404: Not Found</h1>
<p>Sorry, the requested URL "/style.css" caused an error.</p>
Not found
</body></html>
Wenn ich was falsch mache bzw. hierbei etwas beachten muss, dann sagt es mir bitte :-)

VG
bankkind
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

"/styles.css" sieht aber eher nach einem absoluten Pfad aus. Sicher das dem so sein soll?
bankkind
User
Beiträge: 106
Registriert: Freitag 14. September 2007, 23:02
Wohnort: Teltow
Kontaktdaten:

Ich denke das interpretiert bottle so!

In meinem Template sieht die Zeile folgendermaßen aus:

Code: Alles auswählen

<link rel="stylesheet" type="text/css" href="style.css">
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Bottle fängt ALLE URLs ab, auch die von existierenden Dateien. Du brauchst sowas:

Code: Alles auswählen

from bottle import send_file, route

@route('/:filename#.+\.(css)#')
def static_file(filename):
    send_file(filename, root='/path/to/static/files')
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
snafu
User
Beiträge: 6831
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Defnull: Vielleicht wär's hinsichtlich der Nutzerfreundlichkeit nicht schlecht, einen solchen @static-Dekorator anzulegen. Den Basis-Pfad könnte man ja in einer lokalen Konstante speichern.

Oder halt direkt eine Funktion add_stylesheet(), die das für einen regelt und das entsprechende link-Element erzeugt. Wahlweise auch die Möglichkeit, alle Stylesheet-Dateien als Liste zu übergeben. :)
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Ich hab ein einfaches Formular ausporbiert und bekomme diesen Fehler:

Code: Alles auswählen

Exception happened during processing of request from ('127.0.0.1', 58437)
Traceback (most recent call last):
  File "C:\Python26\lib\site-packages\paste\httpserver.py", line 1062, in proces
s_request_in_thread
    self.finish_request(request, client_address)
  File "C:\Python26\lib\SocketServer.py", line 320, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "C:\Python26\lib\SocketServer.py", line 615, in __init__
    self.handle()
  File "C:\Python26\lib\site-packages\paste\httpserver.py", line 436, in handle
    BaseHTTPRequestHandler.handle(self)
  File "C:\Python26\lib\BaseHTTPServer.py", line 329, in handle
    self.handle_one_request()
  File "C:\Python26\lib\site-packages\paste\httpserver.py", line 431, in handle_
one_request
    self.wsgi_execute()
  File "C:\Python26\lib\site-packages\paste\httpserver.py", line 289, in wsgi_ex
ecute
    for chunk in result:
TypeError: 'NoneType' object is not iterable
----------------------------------------
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

jbs hat geschrieben:Ich hab ein einfaches Formular ausporbiert und bekomme diesen Fehler:

Code: Alles auswählen

Exception happened during processing of request from ('127.0.0.1', 58437)
Traceback (most recent call last):
  File "C:\Python26\lib\site-packages\paste\httpserver.py", line 1062, in proces
s_request_in_thread
    self.finish_request(request, client_address)
  File "C:\Python26\lib\SocketServer.py", line 320, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "C:\Python26\lib\SocketServer.py", line 615, in __init__
    self.handle()
  File "C:\Python26\lib\site-packages\paste\httpserver.py", line 436, in handle
    BaseHTTPRequestHandler.handle(self)
  File "C:\Python26\lib\BaseHTTPServer.py", line 329, in handle
    self.handle_one_request()
  File "C:\Python26\lib\site-packages\paste\httpserver.py", line 431, in handle_
one_request
    self.wsgi_execute()
  File "C:\Python26\lib\site-packages\paste\httpserver.py", line 289, in wsgi_ex
ecute
    for chunk in result:
TypeError: 'NoneType' object is not iterable
----------------------------------------
Du denkst in result ist irgend ein iterable. Ist es aber nun einmal nicht, sondern "None". Kannst das Dir ja auch per print vor der Schleife ausgeben ;-)

Ohne Quellcode kann man aber schwerlich sagen, wo der Fehler ensteht oder wieso er auftritt!
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Ich denke gar nichts!

Ich habe einfach nur ein Formular an bottle gesendet und der spuckt den Fehler aus.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

jbs hat geschrieben:Ich denke gar nichts!

Ich habe einfach nur ein Formular an bottle gesendet und der spuckt den Fehler aus.
OOps, nun hab ich erst gesehen, dass das tatsächlich ein Fehler ist, den bottle wohl verursacht oder eben nicht verhindert.

Dennoch kann man ohne Deinen Quellcode sicherlich nicht rausfinden, was da genau schief läuft. Irgend etwas ist eben "leer" und daher später nicht iterierbar.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Meine Funktion hat None zurückgegeben. So jetzt gehts :)
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

in Bottle.__call__ sollte IMHO überprüft werden, ob ``handler(**args)`` etwas zurueckliefert oder sonst den Statuscode 501 senden
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Ein 500er ist schon ganz ok, da der Entwickler hier einen
Fehler gemacht hat. Im nächsten Release wird das aber von Bottle und nicht vom WSGI Server abgefangen, damit schönere Fehlermeldungen erzeugt werden können.

Trotzdem wird der Fehler nicht anders behandelt, als eine Exception im Handler-Code, denn genau das ist es: Eine unerwartete Ausnahmesituation. So ein Fehler SOLL dem Entwickler um die Ohren fliegen ;)
Bottle: Micro Web Framework + Development Blog
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Was ich auch wenig komisch finde: Wenn ich bottle mit Fapws nutze und nen 500er erzeuge (Programmierfehler halt), bekomme ich keinen 500er sondern ein `None` als Antwort und bottle schreit dann, dass es damit nicht weiterarbeiten könnte. Genau Meldung kann ich dir bei Gelegenheit mal zeigen, aber du könntests das auch selbst testen.

Gruß
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

Hallo,
ich habe folgendes Problem:
Ich wollte mal zur übung eine art suchmachine programmieren. Die Suchmachine öffnet immer bei einer Suchanfrage einen Index mit den Suchergebnissen..... nunja... sollte sie zumindest. Wenn ich das Such Modul ganz normal mit meinen Python Intepreter ausführe funktioniert alles wunderbar; doch baue ich das Modul in die Website ein kommt immer eine "500"er Fehlermeldung mit dem Fehler: "Unhandled Exception: IOError(13, 'Permission denied') ".
Nun liegt es nicht daran das ich die Fehlermeldung nicht verstehe sondern daran das ich nicht weiß wie ich den Index "freigeben" kann.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Das sieht nach einer falschen Rechteeinstellung des Verzeichnisses aus, verwendest du SQLite und die Datenbankdatei hat die falschen Rechte für den Webserver?
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

Ich verwende gar keine Datanbank in diesem sinne. Das Python Script öffnet nur eine bestimmte Datei in einem Ordner.
Von Datanbank prgrammierung verstehe ich gar nicht so viel.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

microkernel hat geschrieben:Ich verwende gar keine Datanbank in diesem sinne. Das Python Script öffnet nur eine bestimmte Datei in einem Ordner.
Dann überprüfe mal die Rechte dafür. Vermutlich hast Du kein Leserecht.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Defnull hat geschrieben:Ein 500er ist schon ganz ok, da der Entwickler hier einen
Fehler gemacht hat. Im nächsten Release wird das aber von Bottle und nicht vom WSGI Server abgefangen, damit schönere Fehlermeldungen erzeugt werden können.

Trotzdem wird der Fehler nicht anders behandelt, als eine Exception im Handler-Code, denn genau das ist es: Eine unerwartete Ausnahmesituation. So ein Fehler SOLL dem Entwickler um die Ohren fliegen ;)
Man muss mit der Fehlermeldung nur was anfangen können und wissen das man schuld ist ;)
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

Hyperion hat geschrieben:
microkernel hat geschrieben:Ich verwende gar keine Datanbank in diesem sinne. Das Python Script öffnet nur eine bestimmte Datei in einem Ordner.
Dann überprüfe mal die Rechte dafür. Vermutlich hast Du kein Leserecht.
Mit den Leserechten ist alles in ordnung. Wenn ich das Such Module per hand ausführe funktioniert es ja auch.
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

microkernel hat geschrieben:
Hyperion hat geschrieben:
microkernel hat geschrieben:Ich verwende gar keine Datanbank in diesem sinne. Das Python Script öffnet nur eine bestimmte Datei in einem Ordner.
Dann überprüfe mal die Rechte dafür. Vermutlich hast Du kein Leserecht.
Mit den Leserechten ist alles in ordnung. Wenn ich das Such Module per hand ausführe funktioniert es ja auch.
1) Wenn dein Webserver das Script startet, dann gelten die rechte des Web Servers, nicht die deines eigenen Kontos.
2) Wenn du mod_wsgi benutzt, funktionieren relative Pfade nicht mehr wie erwartet. './datei.txt' muss dann durch '/voller/pfad/zu/datei.txt' ersetzt werden.
Bottle: Micro Web Framework + Development Blog
Antworten