我有服务器在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__)))
请帮帮我,因为我不知道如何修复这个bug
将模板位置添加到TEMPLATE_DIR
,而不是sys.path
:
bottle.TEMPLATE_PATH.insert(0, 'views')
您可能会发现使用绝对路径更加健壮:
bottle.TEMPLATE_PATH.insert(0, '/path/to/xxx/views')
默认情况下,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
。
这样,您只需将代码从一台机器移动到另一台机器,然后从任何工作目录运行它,只要您的视图文件夹位置始终位于相对于您的应用程序的正确位置,就可以找到它。
如果只将一个关键字参数传递给template()函数,则它将被解释为模板文件的名称。例:
return template('<h3>Hello World!</h3>')
如果您没有名称为'<h3>Hello World!</h3>'
的模板文件,则会出现template not found
错误。
在字符串中添加替换,并将关键字参数添加到同一行代码中将导致Bottle尝试将第一个参数呈现为模板本身,而不是将其作为文件进行搜索。
return template('<h3>Hello, {{foobar}}</h3>', foobar='foobar')