Bottlepy:找不到模板

时间:2013-08-27 08:46:55

标签: python bottle

我在apache上运行服务器。我用的是bottle.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__)))

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

5 个答案:

答案 0 :(得分:5)

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

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

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

bottle.TEMPLATE_PATH.insert(0, '/path/to/xxx/views')

答案 1 :(得分:1)

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

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

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

index.py是您的Bottle应用入口点,您需要以index.py作为当前工作目录启动xxx

对模板文件夹的路径进行硬编码应该可行,但不是便携式解决方案。

然而,您可以通过在运行时中使用以下代码确定模板文件夹的绝对路径,以便携式方式指定模板文件夹的绝对路径:

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

这样,您只需将代码从一台机器移动到另一台机器,然后从任何工作目录运行它,只要您的视图文件夹位置始终位于相对于您的应用的正确位置即可它会被发现。

答案 2 :(得分:0)

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

from pathlib import Path
from bottle import TEMPLATE_PATH

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

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

答案 3 :(得分:0)

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

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

唯一的区别是禁止“ include”之后的空格。

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

模板必须放在瓶子中。TEMPLATE_PATH bottle.TEMPLATE_PATH.insert(0,abs_views_path)

答案 4 :(得分:-1)

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

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

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

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

return template('<h3>Hello, {{foobar}}</h3>', foobar='foobar')