Задержка объявления статических файлов / папок с CherryPy - PullRequest
1 голос
/ 10 апреля 2011

У меня есть одно приложение CherryPy, обслуживающее два веб-сайта, каждый из которых хранит свои статические файлы в соответствующих подпапках папки моего приложения (каждая подпапка названа в честь соответствующего домена).В моей основной программе верхнего уровня (Main.py) сайт запускается с cherrypy.quickstart(Root(), '/',config='cherrypy.cfg').Пока все хорошо ...

У меня проблема со статическими объявлениями в config.cfg, которые обычно начинаются с

[/]
tools.staticdir.root = '/domain name/root/static/folder'
tools.staticdir.on = True
tools.staticdir.dir = ''

[/css]
tools.staticdir.on = True
tools.staticdir.dir = 'css'

Однако в то время приложение.запускается, я не знаю значения папки tools.staticdir.root, пока не получу запрос, затем я могу оценить доменное имя (через. cherrypy.request.base), затем установить путь к подпапке по умолчанию и корневую папку соответственно.

Таким образом, вопрос в том, могу ли я «отложить» объявление моих статических файлов / папок до тех пор, пока не будет вызван мой метод Index () (если да, то как?), Или они могут быть объявлены только при cherrypy.быстрый запуск () запущен?

TIA, Alan

1 Ответ

1 голос
/ 11 апреля 2011

Все инструменты просто могут вызываться с некоторыми настройками, так что вы можете подождать до вашего метода индекса с помощью:

def index(self, ...):
    root = my_domain_map[cherrypy.request.headers['Host']]
    cherrypy.lib.staticdir(section='', dir='', root=root)
    # And then this funky hack...
    return cherrypy.response.body
index.exposed = True

... или просто позвонив по номеру cherrypy.lib.static.serve_file , что еще ниже ...

... но есть более интегрированный способ. Установите аргумент root перед тем, как перейти к методу index, и, действительно, перед тем, как вызывается инструмент staticdir. Он вызывается в хуке before_handler (приоритет 50; младшие числа запускаются первыми). Итак, вы хотите проверить заголовок вашего хоста где-то прямо перед этим; давайте выберем приоритет 30:

def staticroot(debug=False):
    root = my_domain_map[cherrypy.request.headers['Host']]
    cherrypy.request.toolmaps['tools']['staticdir']['root'] = root
cherrypy.tools.staticroot = cherrypy.Tool(
    staticroot, point='before_handler', priority=30)

Затем включите ваш новый инструмент в конфигурации:

[/]
tools.staticroot.on = True

... и поверните его.

...