Устраните ошибку TemplateNotFound от Flask под Gunicorn

У меня есть приложение Flask, которое я пытаюсь развернуть с помощью Gunicorn и nginx. Однако, хотя он работает нормально локально, он выдает ошибку TemplateNotFound, когда я запускаю с Gunicorn на моем удаленном сервере.

Я не уверен, как вообще начать отлаживать это, не говоря уже о том, почему он не работает ... хотел бы помочь первым, если не вторым. Я подумал, что это может быть проблема с правами доступа, так что chmod & папка с шаблонами 777 ... не повезло. Вот все соответствующие детали:

install script

Начиная с простой установки Ubuntu 10.04, я запускаю это, чтобы настроить сервер и извлекать свой код:https://github.com/total-impact/total-impact-deploy/blob/master/deploy.sh, Затем я помещаю этот файл конфигурации nginx в / etc / nginx / sites-available / total-effect:

server {
    location / {
        proxy_pass http://127.0.0.1:8000;
    }
}

Наконец, я перехожу в каталог приложения и запускаюgunicorn web:appи нажмите IP-адрес сервера. Это генерирует 500 в браузере, и это выводит в командной строке:

stack trace:
[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

Ответы на вопрос(3)

Сегодня у меня возникли идентичные проблемы после долгого периода времени, когда мое приложение Flask функционировало вполне нормально (то есть не генерировало исключений TemplateNotFound). Ни один из подходов, упомянутых здесь другими, не достиг цели или не показался уместным (например,app.debug, путь манипуляции).

Вместо этого я отследил его до стандартной строки инициализации приложения Flask:

app = Flask(__name__)

Я изменился__name__ к другому значению (чтобы получить доступ к именованному логгеру), не ожидая разворачивания всей этой резни :-) Не изменяйте это значение, если вы не очень хорошо знакомы с внутренностями Flask.

Я только что провел 2 часа в очень похожей ситуации и подумал, что я опубликую то, что в итоге оказалось решением.

Внезапно я получал ошибки TemplateNotFound в журналах Apache из моего приложения Flask, которое работало до сих пор. Это привело к 500 ошибкам по всему сайту.

Первая проблема заключалась в том, что ошибки TemplateNotFound не отображались, если у меня не было отладки Flask. флаг включен - никаких признаков каких-либо проблем в журнале Apache не было, несмотря на то, что LogLevel установлен вinfo.

Запуск приложения & quot; локально & quot; (Колба слушаетlocalhost:5000) было хорошо (можно проверить страницы черезwget 127.0.0.0:5000). Оказалось, что копия основного кода Python веб-приложения каким-то образом оказалась в каталоге выше, где должна была быть. Сначала он был импортирован wsgi, и в результате относительный путь к шаблонам был неверным.

Ваши шаблоны находятся в [app root] / templates /?

Если это так, убедитесь, что ваш путь правильный. Поместите это как первую строку в представлении, которое обрабатывает вашу домашнюю страницу:

return app.root_path

Если это то, что вы ожидаете увидеть - или если вы используете Blueprints или другой метод, который каким-либо образом изменяет среду Jinja по умолчанию, - это немного сложнее.

Как ни странно, у Jinja, похоже, нет метода jinja2.Environment.FileSystemLoader.get_search_path (). Я предполагал, что будет один :(

Ваш ответ на вопрос