Проблема
Проблемная строка такая:
<link rel="stylesheet" type="text/css" href="static/prettify.css" />
Адрес файла CSS является относительным, поэтому полный абсолютный адрес вычисляется из местоположения загруженной страницы.
Для http://192.168.1.3/temp/
это будет http://192.168.1.3/temp/static/prettify.css
(правильно).
Для http://192.168.1.3/temp
это будет http://192.168.1.3/static/prettify.css
.temp
считается файлом в корневом каталоге, а не отдельным подкаталогом.
Решение
Не существует приемлемого способа использовать один относительный адрес для ссылки настатические ресурсы.Ваше приложение, скорее всего, будет иметь «вложенные» пути, такие как /article/some-name
, или /view/content/566
, или что-то вроде этого, а также такие простые пути, как /
.
. Вы можете попытаться указать root-на основе пути, например /temp/static/prettify.css
, в вашем шаблоне, но это означает, что вам придется изменить шаблон, если вы переместите само приложение (скажем, на myapp.example.com/
с example.com/myapp/
).
Вместо этого выНужно указать платформе, чтобы сделать правильный путь к ресурсу, который нужно использовать.У бутылки есть функция с именем get_url , чтобы облегчить это.К сожалению, это не упоминается в уроках по бутылкам.
Код
Вот что вы должны сделать.
В template.tpl
, позвоните get_url
, ссылаясь на статический обработчик:
<link rel="stylesheet" type="text/css"
href="{{ get_url('static', filename='prettify.css') }}" />
В routes.py
, импорт get_url
:
from bottle import Bottle, run, route, static_file, view, template,
post, request, get_url
Затем назовите ваш обработчик, чтобы вы могли передать его имя get_url
:
@app.route('/static/<filename>', name='static')
def server_static(filename):
return static_file(filename, root='static')
Наконец, укажите фактический get_url
в качестве аргумента шаблона при рендеринге шаблона:
@app.route('/')
def index():
return template('template', text='This is index page!', get_url=get_url)
В качестве альтернативы, вместо предоставления get_url
в каждом обработчике, установите шаблон по умолчанию в index.py
:
from Bottle import SimpleTemplate
SimpleTemplate.defaults["get_url"] = app.get_url
Предупреждение : последний способ, по-видимому, недокументирован, но объяснен автором бутылки в списке рассылки .
Заключительная мысль
Поскольку каждая страница на сайте должна иметь канонический адрес, вы можете выбрать одну форму (с косой чертой или без нее) в качестве канонической и добавить какой-либо вид перенаправления с другойодин.