首页 文章

解决了Gunicorn下Flask的TemplateNotFound错误

提问于
浏览
13

我有一个Flask应用程序,我正在尝试使用Gunicorn和nginx进行部署 . 但是,虽然它在本地工作正常,但是当我在远程服务器上运行Gunicorn时会抛出TemplateNotFound错误 .

我不确定如何开始调试这个,更不用说为什么它会失败...如果不是后者,我会喜欢前者的帮助 . 我想也许这是一个权限问题,所以chmod将模板文件夹改为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;
    }
}

最后,我浏览app目录并运行 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

3 回答

  • 30

    你的模板是[app root] / templates /吗?

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

    return app.root_path
    

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

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

  • 2

    今天,经过我很长时间的Flask应用程序表现非常正常(即没有抛出TemplateNotFound异常),我遇到了相同的问题 . 其他人提到的方法都没有达到标记或似乎合适(例如 app.debug ,路径操纵) .

    相反,我将其跟踪到标准的Flask app初始化行:

    app = Flask(__name__)
    

    我已经将 __name__ 更改为另一个值(以获取对命名 Logger 的访问权限),并不期望所有这些大屠杀展开:-)除非您非常熟悉Flask内部,否则不要更改此值 .

  • 0

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

    我突然从 生产环境 中的Flask应用程序中获取Apache日志中的TemplateNotFound错误,直到那时一直运行良好 . 这导致整个网站出现500个错误 .

    第一个问题是TemplateNotFound错误没有显示,除非我有Flask的"debug"标志 - 尽管LogLevel设置为 info ,但在Apache日志中根本没有任何问题的迹象 .

    运行应用程序"locally"(Flask侦听 localhost:5000 )很好(可以通过 wget 127.0.0.0:5000 测试页面) . 事实证明,主Web应用程序python代码的副本已经以某种方式落在上面应该存在的目录中 . 这是由wsgi首先导入的,因此,模板的相对路径不正确 .

相关问题