Statisches Routen mit bottle und Apache

Django, Flask, Bottle, WSGI, CGI…
Antworten
bastel-wastel
User
Beiträge: 28
Registriert: Samstag 20. Februar 2010, 15:14

Hallo zusammen,

ich habe hier ein Problem und komme nicht weiter. Anbei ein gekürztes Beispiel, mit dem ich mittels bottle eine html-Seite übergebe. Im Template "index.html" wird auf eine statische Datei referenziert, die entsprechend im Unterordner "css" liegt.

Code: Alles auswählen

<link href="css/bootstrap.min.css" rel="stylesheet">
Daher habe ich entsprechende Routen per bottle erzeugt (siehe angehängtes Beispiel). Mit dem bottle-eigenen Test-Webserver

Code: Alles auswählen

run(host='localhost', port=8080, debug=True)

wird auch alles korrekt ausgeliefert. Wenn ich jedoch apache/wsgi nutze werden die statischen Dateien nicht ausgeliefert. Im Log vom apache taucht folgendes auf:

Code: Alles auswählen

[client 127.0.0.1] File does not exist: /var/www/js, referer: http://localhost/klima
[Mon Feb 23 20:39:47 2015] [error] [client 127.0.0.1] File does not exist: /var/www/css, referer: http://localhost/klima
[Mon Feb 23 20:39:47 2015] [error] [client 127.0.0.1] File does not exist: /var/www/js, referer: http://localhost/klima
[Mon Feb 23 20:39:47 2015] [error] [client 127.0.0.1] File does not exist: /var/www/graphics, referer: http://localhost/klima
Offensichtlich funktionieren die Routen hier nicht mehr aber warum?


Grüße
bastel

Code: Alles auswählen

from bottle import Bottle, route, debug, template, static_file, get, run, default_app
import os
import bottle

bottle.TEMPLATE_PATH.insert(0, '/var/www/klima')
app = Bottle()

@route('/')
@route('/index.html')
def index():
  return template('index.html', tmpl_dic)

@route('/verlauf.html')
def verlauf():
  return template('verlauf.html')


# Statische Routen
@route('/graphics/<filename:re:>')
def server_static_files(filename):
  return static_file(filename, root='./graphics')

@route('/css/<filename>')
def server_static_files2(filename):
  return static_file(filename, root='./css')

@route('/js/<filename>')
def server_static_files3(filename):
  return static_file(filename, root='./js')
  

# Nur zum Debuggen
#run(host='localhost', port=8080, debug=True)

application = default_app()
BlackJack

@bastel-wastel: Du gibst im Skript relative Pfade für die Verzeichnisse an. Ich nehme mal an die Liegen eigentlich unter ``/var/www/klima/``, aber das aktuelle Arbeitsverzeichnis das der Apache hier vorgibt ist offensichtlich ``/var/www/``.

Ich würde die Pfade (auch den zu den Templates) dynamisch erzeugen und zwar relativ zum Verzeichnis in dem das Python-Modul liegt. Dessen Dateinamen bekommt man über den Namen `__file__` der auf Modulebene definiert ist. Ich benutze normalerweise das hier:

Code: Alles auswählen

@route('/static/<path:path>')
def static(database, path):
    return static_file(path, os.path.join(os.path.dirname(__file__), 'static'))
Allerdings nur für den Testserver, denn wenn der Apache im Spiel ist, dann lasse ich *den* die statischen Sachen direkt ausliefern.
bastel-wastel
User
Beiträge: 28
Registriert: Samstag 20. Februar 2010, 15:14

Danke für Deine Antwort, aber ich steig' noch nicht ganz durch. Wenn ich Dein Beispiel deuten will, dann würde ich meinen Code so umstricken:

Code: Alles auswählen

@route('/graphics/<filename>')
def server_static_files(filename):
  return static_file(filename, root=os.path.join(os.path.dirname(__file__) ,'graphics'))
Aber das funktioniert so nicht, apache sucht nach wie vor nur unter "/var/www".
Antworten