Bottle aus Paket einbinden ...

Django, Flask, Bottle, WSGI, CGI…
Antworten
Benutzeravatar
mathman
User
Beiträge: 92
Registriert: Mittwoch 19. November 2008, 08:27
Wohnort: Magdeburg
Kontaktdaten:

Hallo,

ich habe die bottle.py in ein Unterverzeichnis kopiert und möchte diese aber in einem Skript aus dem Hauptverzeichnis aufrufen.

/test.py <-- Datei die Bottle aufruft
/server in dem sich Bottle befindet
/workspace/sb2brain/src/server$ ls
bottle.py bottle.pyc __init__.py __init__.pyc views
Nun habe ich zwei Varianten ausprobiert bottle zu Importieren ...

Code: Alles auswählen

# Variante 1 from server.bottle import route, template, run
# Variante 2 from server import bottle

@route('/template_test')
def test(name='foo'):
    return template('mein_template.tpl', name=name)

run(host='localhost', port=8080)
In Variante 1 wird der Server zwar gestartet, jedoch kommt im Browser folgender Fehler:
ImportError: Could not generate the error page. Please add bottle to sys.path

In Variante 2 gibt die Konsole folgenden Fehler aus:

Code: Alles auswählen

Traceback (most recent call last):
  File "/home/.../workspace/sb2brain/src/bootle_test_template.py", line 4, in <module>
    @route('/template_test')
NameError: name 'route' is not defined
Ich habe mir in "Python3 das umfassende Handbuch" den Abschnitt zum import der Pakete durch gelesen, und nach VAriante 1 sollte es eigentlich funktionieren, was es leider nicht tut.
Jetzt habe ich sicherlich nicht verstanden wie man hier den Import Befehl richtig anwendet. Kann mir jemand auf die Sprünge helfen ?

Gruß
BlackJack

Das "eingebaute" Template für die Fehlerseite importiert etwas aus `bottle`. Das gibt es bei Dir ja aber nicht mehr. `bottle` selber erwartet, dass es unter genau dem Namen importiert werden kann. Umbenennen oder in Pakete verschieben geht also nicht so ohne weiteres.
Benutzeravatar
mathman
User
Beiträge: 92
Registriert: Mittwoch 19. November 2008, 08:27
Wohnort: Magdeburg
Kontaktdaten:

Vielen Dank für die Antwort.

Bottle sucht ja in dem Ordner view nach den Templates. In der Doku steht das dieser in "bottle.TEMPLATE_PATH" gespeichert ist. Kann ich diesen überschreiben, so dass eine einen Unterordner nutzen kann und damit nur die bottle.py im Hauptverzeichnis kopieren muss?

#nachtrag

Code: Alles auswählen

@route('/')
def test(name='foo'):
    return template('./server/views/formular.tpl', name=name)
Konnte es so lösen, das ich den absoluten Pfad angegeben habe. Gibt es noch eine elegantere Variante ?
Benutzeravatar
noisefloor
User
Beiträge: 4149
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
In Variante 2 gibt die Konsole folgenden Fehler aus:
Ist ja auch richtig, weil die "route" nirgendwo importierst. Du importierst Bottle komplett. Also muss die Zeile wenn

Code: Alles auswählen

@bottle.route(...)
heißen.
In der Doku steht das dieser in "bottle.TEMPLATE_PATH" gespeichert ist. Kann ich diesen überschreiben,
Überschreiben besser nicht, aber erweitern:

Code: Alles auswählen

bottle.TEMPLATE_PATH.insert(0,'/pfad/zu/den/templates/%s.tpl')
Gruß, noisefloor
Benutzeravatar
lynadge
User
Beiträge: 112
Registriert: Sonntag 4. April 2010, 10:17

Ich mache das so:

Code: Alles auswählen

import sys
sys.path.append('external')

import bottle
In deiner Variante müsstest du also external mit server austauschen:

Code: Alles auswählen

import sys
sys.path.append('server')

import bottle
Antworten