Устранение неполадок TemplateNotFound от Flask под Gunicorn
У меня есть приложение Flask, которое я пытаюсь развернуть с помощью Gunicorn и nginx. Однако, хотя он работает нормально локально, он выдает ошибку TemplateNotFound, когда я запускаю с Gunicorn на удаленном сервере.
Я не уверен, как даже начать отлаживать это, не говоря уже о том, почему это не удается... хотелось бы помочь первой, если не последней. Я подумал, что, возможно, это проблема с разрешениями, поэтому chmod'd папка шаблонов для 777... не повезло. Здесь все реляционные детали:
установить script
Начиная с простой установки Ubuntu 10.04, я запускаю ее, чтобы настроить сервер и вытащить мой код: https://github.com/total-impact/total-impact-deploy/blob/master/deploy.sh. Затем я поместил этот файл конфигурации nginx в /etc/nginx/sites -available/total-impact:
server {
location / {
proxy_pass http://127.0.0.1:8000;
}
}
Наконец, я перемещаюсь по каталогу приложений и запускаю gunicorn web:app
, и ударяю по IP-адресу сервера. Это создает 500 в браузере, и этот вывод в командной строке:
трассировка стека:
[email protected]:/home/ti/total-impact-webapp/totalimpactwebapp# gunicorn web:app2012-05-28 23:15:06 [15313] [INFO] Starting gunicorn 0.14.3
2012-05-28 23:15:06 [15313] [INFO] Listening at: http://127.0.0.1:8000 (15313)
2012-05-28 23:15:06 [15313] [INFO] Using worker: sync
2012-05-28 23:15:06 [15316] [INFO] Booting worker with pid: 15316
2012-05-28 23:15:12,274 - totalimpactwebapp.core - ERROR - Exception on / [GET]
Traceback (most recent call last):
File "/usr/local/lib/python2.6/dist-packages/flask/app.py", line 1292, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python2.6/dist-packages/flask/app.py", line 1062, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/local/lib/python2.6/dist-packages/flask/app.py", line 1060, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python2.6/dist-packages/flask/app.py", line 1047, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/ti/total-impact-webapp/totalimpactwebapp/web.py", line 60, in home
return render_template('index.html', commits=False)
File "/usr/local/lib/python2.6/dist-packages/flask/templating.py", line 120, in render_template
return _render(ctx.app.jinja_env.get_template(template_name),
File "/usr/local/lib/python2.6/dist-packages/jinja2/environment.py", line 719, in get_template
return self._load_template(name, self.make_globals(globals))
File "/usr/local/lib/python2.6/dist-packages/jinja2/environment.py", line 693, in _load_template
template = self.loader.load(self, name, globals)
File "/usr/local/lib/python2.6/dist-packages/jinja2/loaders.py", line 115, in load source, filename, uptodate = self.get_source(environment, name)
File "/usr/local/lib/python2.6/dist-packages/flask/templating.py", line 61, in get_source
raise TemplateNotFound(template)
TemplateNotFound: index.html
Ответы
Ответ 1
Являются ли ваши шаблоны в [корневом приложении]/шаблонах/?
Если да, убедитесь, что ваш путь верен. Поместите это как первую строку в представлении, которая обрабатывает вашу домашнюю страницу:
return app.root_path
Если это то, что вы ожидаете увидеть, или если вы используете Blueprints или другой метод, который каким-то образом меняет среду Jinja по умолчанию, это немного сложнее.
Как ни странно, Jinja, похоже, не имеет метода jinja2.Environment.FileSystemLoader.get_search_path(). Я предположил, что у него будет один: (
Ответ 2
Сегодня у меня возникли идентичные проблемы после того, как длительное время моего приложения Flask работает нормально (т.е. не выбрасывает исключения TemplateNotFound). Ни один из подходов, упомянутых другими здесь, не попал в точку или не казался подходящим (например, app.debug
, манипуляция с пробелами).
Вместо этого я отследил его до стандартной строки инициализации приложения Flask:
app = Flask(__name__)
Я изменил __name__
на другое значение (чтобы получить доступ к именованному логгеру), не ожидая, что вся эта резня развернется:-) Не изменяйте это значение, если вы не знакомы с внутренними фляшками.
Ответ 3
Я только что провел 2 часа в очень похожей ситуации и подумал, что я опубликую то, что в итоге стало решением.
Я неожиданно получал ошибки TemplateNotFound в журналах Apache из моего приложения Flask, в процессе производства, которое до сих пор работало нормально. Это привело к 500 ошибкам на сайте.
Первая проблема заключалась в том, что ошибки TemplateNotFound не показывались, если у меня не был флаг Flask "debug" - в журнале Apache не было никаких признаков, несмотря на то, что LogLevel установлен на info
.
Запуск приложения "локально" (флажок прослушивается на localhost:5000
) был прекрасен (можно проверить страницы с помощью wget 127.0.0.0:5000
). Оказалось, что копия основного кода python для веб-приложений каким-то образом попала в каталог выше, где он должен был быть. Сначала это было импортировано wsgi, и в результате относительный путь к шаблонам был неправильным.