13

我有一个尝试使用 Gunicorn 和 nginx 部署的 Flask 应用程序。然而,虽然它在本地运行良好,但当我在远程服务器上使用 Gunicorn 运行时,它会引发 TemplateNotFound 错误。

我什至不知道如何开始调试它,更不用说它为什么会失败......如果不是后者,我会喜欢前者的帮助。我认为这可能是权限问题,所以将模板文件夹更改为 777 ......不走运。这是所有相关的细节:

安装脚本

从一个裸 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,并在命令行上输出:

堆栈跟踪:

root@jc:/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
4

3 回答 3

30

您的模板在 [app root]/templates/ 中吗?

如果是这样,请检查以确保您的路径正确。将此作为处理您的主页的视图中的第一行:

return app.root_path

如果这是您希望看到的 - 或者如果您正在使用蓝图或其他以某种方式更改默认 Jinja 环境的方法 - 它会稍微复杂一些。

奇怪的是,Jinja 似乎没有 jinja2.Environment.FileSystemLoader.get_search_path() 方法。我以为它会有一个:(

于 2012-06-15T16:57:18.103 回答
2

今天,在我的 Flask 应用程序运行很长一段时间后,我遇到了同样的问题(即没有抛出 TemplateNotFound 异常)。这里其他人提到的方法都没有达到目标或似乎合适(例如app.debug,路径操作)。

相反,我将其追踪到标准的 Flask 应用程序初始化行:

app = Flask(__name__)

我已更改__name__为另一个值(以访问命名记录器),没想到所有这些大屠杀都会展开 :-) 除非您非常熟悉 Flask 内部结构,否则不要更改此值。

于 2014-10-30T17:25:01.640 回答
0

我刚刚在非常相似的情况下花了 2 个小时,并认为我会发布最终成为解决方案的内容。

我突然从我的 Flask 应用程序的 Apache 日志中收到 TemplateNotFound 错误,在生产中,在此之前一直运行良好。这导致整个站点出现 500 个错误。

第一个问题是 TemplateNotFound 错误没有显示,除非我打开了 Flask 的“调试”标志——尽管 LogLevel 设置为 .Apache 日志中根本没有任何问题的迹象info

“本地”运行应用程序(Flask 监听localhost:5000)很好(可以通过 测试页面wget 127.0.0.0:5000)。事实证明,主 Web 应用程序 python 代码的副本不知何故落在了它应该在上面的目录中。这是首先由 wsgi 导入的,因此模板的相对路径不正确。

于 2012-09-07T21:40:10.527 回答