4

我有在 apache 上运行的服务器。我使用瓶子.py。当我要去 xxx/getbio 时,有时它会返回:

Error: 500 Internal Server Error: Template 'bio' not found.

此错误并非总是发生:如果我重新启动 apache,它会正常化几个小时,但会再次发生。这是代码片段:

@route('/getbio')
def getBio():
    return template('bio')

这是文件结构:

xxx/
├── views/
│   ├── bio.tpl
└── index.py

而且我没有错过以下代码行:

sys.path.append(os.path.dirname(os.path.abspath(__file__)))
sys.path.append('views')
os.chdir(os.path.dirname(os.path.abspath(__file__)))

请帮助我,因为我不知道如何修复这个错误

4

5 回答 5

8

将您的模板位置添加到TEMPLATE_DIR,而不是sys.path

bottle.TEMPLATE_PATH.insert(0, 'views')

您可能会发现使用绝对路径更加健壮:

bottle.TEMPLATE_PATH.insert(0, '/path/to/xxx/views')
于 2013-08-27T14:00:08.900 回答
5

默认情况下,Bottle 将views文件夹添加到模板文件的模板路径中。但是,至少在 Windows 上,它会查找相对于调用 python 脚本的位置(即当前工作目录)的视图文件夹,而不是相对于找到应用程序入口点.py文件的位置。

因此,如果您的文件夹结构如下所示:

xxx/
├── views/
│   ├── bio.tpl
└── index.py

并且index.py是您的 Bottle 应用程序入口点,您需要作为当前工作目录启动index.pyxxx

硬编码模板文件夹的路径应该可以工作,但不是可移植的解决方案。

但是,您可以通过在运行时使用如下代码确定模板文件夹的绝对路径,以可移植的方式指定它:

import os     
abs_app_dir_path = os.path.dirname(os.path.realpath(__file__))
abs_views_path = os.path.join(abs_app_dir_path, 'views')
bottle.TEMPLATE_PATH.insert(0, abs_views_path )

只需更改执行os.path.join调用的行以正确构造与abs_views_path您的文件相关的内容。

这样,您可以简单地将代码从一台机器移动到另一台机器,并从任何工作目录运行它,只要您的视图文件夹位置始终位于相对于您的应用程序的正确位置,它就会被找到。

于 2018-06-04T02:17:41.050 回答
0

不幸的是,瓶子在 include() 函数中有一个包

% include ("my_template.tpl")  # template not found
% include("my_template.tpl")  # template found

唯一的区别是“包含”之后的空格是被禁止的。

希望此问题消息将帮助某人节省调试时间 https://github.com/bottlepy/bottle/issues/1258

并且模板必须在 bottle.TEMPLATE_PATH bottle.TEMPLATE_PATH.insert(0, abs_views_path )

于 2020-11-26T12:18:53.710 回答
0

AFAIK,瓶子有TEMPLATE_PATH常量来存储模板路径。尝试在您想要的情况下对其进行修改,例如:

from pathlib import Path
from bottle import TEMPLATE_PATH

TEMPLATE_PATH.append(str(Path('path') / 'to' / 'template'))

然后,path/to/template路径将作为模板路径之一包含在您的应用程序中。

于 2020-08-09T20:03:38.473 回答
-1

如果您只将一个关键字参数传递给 template() 函数,它将被解释为模板文件的名称。例子:

return template('<h3>Hello World!</h3>')

如果您没有名为 的模板文件'<h3>Hello World!</h3>',则会收到template not found错误消息。

在字符串中添加一个替换,并且在同一行代码中添加关键字参数将导致 Bottle 尝试将第一个参数呈现为模板本身,而不是作为文件搜索它。

return template('<h3>Hello, {{foobar}}</h3>', foobar='foobar')
于 2019-01-14T14:45:39.107 回答