Bottlepy:找不到模板

use*_*650 3 python bottle

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

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

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

@route('/getbio')
def getBio():
    return template('bio')
Run Code Online (Sandbox Code Playgroud)

这是文件结构:

xxx/
??? views/
?   ??? bio.tpl
??? index.py
Run Code Online (Sandbox Code Playgroud)

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

sys.path.append(os.path.dirname(os.path.abspath(__file__)))
sys.path.append('views')
os.chdir(os.path.dirname(os.path.abspath(__file__)))
Run Code Online (Sandbox Code Playgroud)

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

ron*_*man 5

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

bottle.TEMPLATE_PATH.insert(0, 'views')
Run Code Online (Sandbox Code Playgroud)

您可能会发现使用绝对路径更可靠:

bottle.TEMPLATE_PATH.insert(0, '/path/to/xxx/views')
Run Code Online (Sandbox Code Playgroud)


Mat*_*ugh 5

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

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

xxx/
??? views/
?   ??? bio.tpl
??? index.py
Run Code Online (Sandbox Code Playgroud)

并且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 )
Run Code Online (Sandbox Code Playgroud)

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

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