Seite 8 von 30

Verfasst: Freitag 4. September 2009, 19:42
von bankkind
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

Verfasst: Freitag 4. September 2009, 20:23
von Hyperion
"/styles.css" sieht aber eher nach einem absoluten Pfad aus. Sicher das dem so sein soll?

Verfasst: Freitag 4. September 2009, 20:30
von bankkind
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">

Verfasst: Samstag 5. September 2009, 02:26
von Defnull
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')

Verfasst: Samstag 5. September 2009, 11:49
von snafu
@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. :)

Verfasst: Donnerstag 17. September 2009, 15:22
von jbs
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
----------------------------------------

Verfasst: Donnerstag 17. September 2009, 15:25
von Hyperion
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!

Verfasst: Donnerstag 17. September 2009, 15:40
von jbs
Ich denke gar nichts!

Ich habe einfach nur ein Formular an bottle gesendet und der spuckt den Fehler aus.

Verfasst: Donnerstag 17. September 2009, 16:20
von Hyperion
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.

Verfasst: Donnerstag 17. September 2009, 16:41
von jbs
Meine Funktion hat None zurückgegeben. So jetzt gehts :)

Verfasst: Donnerstag 17. September 2009, 17:06
von jbs
in Bottle.__call__ sollte IMHO überprüft werden, ob ``handler(**args)`` etwas zurueckliefert oder sonst den Statuscode 501 senden

Verfasst: Donnerstag 17. September 2009, 17:51
von Defnull
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 ;)

Verfasst: Donnerstag 17. September 2009, 18:21
von Dauerbaustelle
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ß

Verfasst: Donnerstag 17. September 2009, 18:53
von microkernel
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.

Verfasst: Donnerstag 17. September 2009, 19:18
von nemomuk
Das sieht nach einer falschen Rechteeinstellung des Verzeichnisses aus, verwendest du SQLite und die Datenbankdatei hat die falschen Rechte für den Webserver?

Verfasst: Donnerstag 17. September 2009, 19:27
von microkernel
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.

Verfasst: Donnerstag 17. September 2009, 20:04
von Hyperion
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.

Verfasst: Donnerstag 17. September 2009, 20:05
von jbs
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 ;)

Verfasst: Freitag 18. September 2009, 13:34
von microkernel
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.

Verfasst: Freitag 18. September 2009, 13:37
von Defnull
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.