bottle: Pfad zur CSS-Datei

Django, Flask, Bottle, WSGI, CGI…
Antworten
Dadapf
User
Beiträge: 28
Registriert: Mittwoch 16. Dezember 2009, 09:16

Guten Morgen,

wenn bei einer statischen html-Seite eine CSS-Datei angegeben ist, versucht der Browser diese automatisch nachzuladen. Ich nehme an, dass dies bei bottle-generierten statischen Seiten ebenso ist.
Mein Problem ist jetzt nur: wie gebe ich den Pfad dazu an beziehungsweise, wie erreiche ich dies?
Wenn ich den Pfad als Variable übergebe, zeigt ihn mir der Browserquelltext zwar korrekt an, doch die Anfrage wird mit 404 beschieden; egal, ob ich einen absoluten oder relativen (zu bottle.py) Pfad angebe. Sie static_file-Routine habe ich auch ausprobiert, doch dann steht im Browserquelltext an der Stelle Müll. Wobei ich eigentlich eher denke, dass die static_file-Routine zur Auslieferung eines kompletten Dateiinhalts ist?
Hat jemand schon einmal einen Rat, oder muss ich die Quelltext (eindampfen und) einkopieren?
Dank im voraus,

Dadapf
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Poste doch mal etwas Code. Dann kann man Dir leichter helfen.
https://www.xing.com/go/invite/18513630.6a91d4
Dadapf
User
Beiträge: 28
Registriert: Mittwoch 16. Dezember 2009, 09:16

Nu denn:

Das Pythonprogramm:

Code: Alles auswählen

from bottle import debug, get, route, run, static_file, template, TEMPLATE_PATH, view

TEMPLATE_PATH.append(u'./Vorlagen')

Zeilen_Text = \
	u'   <body>'\
	u'		<div class="Kopftext">'\
	u'			<h1>Assamir - Bilder aus den Bergen, Jahr 2010</h1>'

@get('/Seite_1')
def Ausgabe():
	def Zeilen_Kodekopf():
		Titel = u'Bilder aus den Bergen, Jahr 2010'
		Schluesselworte = u'Reisen, Hund, Saluki, Hunderucksack, Wandern, Berge'
		Wurzelpfad = u'/home/BAm2/Programme/Arbeiten/'
		Browser_CSS = Wurzelpfad + u'Betriebsdateien/Assamir.css'
		Browser_CSS = u'./Betriebsdateien/Assamir.css'
		return template('Zeilen_Kodekopf', Text = (Titel, Schluesselworte, Browser_CSS_1))

	Inhalt = u''
	Inhalt = Zeilen_Doctype()
	Inhalt = Inhalt + Zeilen_Kodekopf()
	Inhalt = Inhalt + Zeilen_Text
	return Inhalt

@route('/static/:Pfad#.+#')
def Browser_CSS_1(Pfad):
	Wurzelpfad = u'/home/BAm2/Programme/Arbeiten/'
	Serverpfad = u'/localhost:8080/'
	Browser_CSS = Wurzelpfad + u'Betriebsdateien/Assamir.css'
	Browser_CSS = u'./Betriebsdateien/Assamir.css'
	Browser_CSS = Serverpfad + u'Betriebsdateien/Assamir.css'
	return static_file(Pfad, root = Browser_CSS)

def Zeilen_Doctype():
	return template('Zeilen_Doctype')

debug(True)
run(host='localhost', port=8080, reloader=True) # reloader=True: Startet den Server bei Dateiänderungen neu.
das template "Zeilen_Kodekopf":

Code: Alles auswählen

<head>
	<title>{{Text [0]}}</title>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<!--<meta name="robots" content="noindex, nofollow"></meta>-->
	<meta name="keywords" content="{{Text [1]}}" />
	<meta http-equiv="expires" content="0" />
	<link rel="stylesheet" type="text/css" media="screen"
      href="{{Text [2]}}" />
</head>
Die Mehrfachzuweisungen sind nur Versuche, hätte es auch jeweils auskommentieren können. Ich bin jetzt erst mal für zwei Stunden weg.

Dadapf
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Ich glaube du bringst da etwas durcheinander.
- static_file() liefert Dateien von der Festplatte des Webservers aus. Da musst du also den Server-Pfad und keine URL angeben.
- Deine Route für CSS Dateien beginnt mit '/static/ also sollten Verweise in der HTML Datei auch damit beginnen.
Bottle: Micro Web Framework + Development Blog
Dadapf
User
Beiträge: 28
Registriert: Mittwoch 16. Dezember 2009, 09:16

> Ich glaube du bringst da etwas durcheinander.
Das ist mir klar - bleibt die Frage: was. Bei englischsprachigen Programmierhandbüchern habe ich auch immer das Problem zu erkennen, welche Wörter reserviert sind und welche frei gewählt.

Ich habe jetzt noch einmal herumprobiert und so funktioniert es jetzt:

Code: Alles auswählen

from bottle import debug, get, route, run, static_file, template, TEMPLATE_PATH, view

TEMPLATE_PATH.append(u'./Vorlagen')

Zeilen_Text = \
	u'   <body>'\
	u'		<div class="Kopftext">'\
	u'			<h1>Assamir - Bilder aus den Bergen, Jahr 2010</h1>'

@get('/Seite_1')
def Ausgabe():
	def Zeilen_Kodekopf():
		Titel = u'Bilder aus den Bergen, Jahr 2010'
		Schluesselworte = u'Reisen, Hund, Saluki, Hunderucksack, Wandern, Berge'
		Browser_CSS = u'./Betriebsdateien/Assamir.css'
		return template('Zeilen_Kodekopf', Text = (Titel, Schluesselworte, Browser_CSS))

	Inhalt = u''
	Inhalt = Zeilen_Doctype()
	Inhalt = Inhalt + Zeilen_Kodekopf()
	Inhalt = Inhalt + Zeilen_Text
	return Inhalt

@route('/Betriebsdateien/:Datei')
def Browser_CSS_1(Datei):
	return static_file(Datei, root = u'Betriebsdateien/')

def Zeilen_Doctype():
	return template('Zeilen_Doctype')

debug(True)
run(host='localhost', port=8080, reloader=True) # reloader=True: Startet den Server bei Dateiänderungen neu.
Es ist vielleicht noch nicht der eleganteste Weg, doch einer. Mein Verständnisproblem war einfach, dass ich quasi bottle via static_file explizit anweisen muss, die Browseranfrage nach der CSS-Datei mit der Dateiauslieferung zu beantworten. Das hat mir bisher der Apacheserver meines Dienstleisters abgenommen ...

Dadapf
Benutzeravatar
noisefloor
User
Beiträge: 3857
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Mein Verständnisproblem war einfach, dass ich quasi bottle via static_file explizit anweisen muss, die Browseranfrage nach der CSS-Datei mit der Dateiauslieferung zu beantworten.
Da ist aber kein Problem von Bottle, sondern das ist bei WSGI so. Deine Applikation fängt ja _alle_ Routen ab, die Unterhalb deiner "Root-Route" liegen.
Wenn du das anders lösen möchtest, dann musst du statische Inhalte wie CSS außerhalb von deiner Applikation platzieren, also in eine Verzeichnis, was "normal" vom Webserver ausgeliefert wird.

Zum Programm: Du verknüpfst die Ausgabe von zwei Template miteinander. Eleganter ist IMHO - und es macht auch mehr Sinn in diesem Fall - wenn du den Zeilen-Kodekopf per %include in das Haupttemplate einbindest.

Gruß, noisefloor
Antworten