我试图了解如何在几个目录中拆分使用Mako和CherryPy的项目。我准备了以下目录结构:
[FOLDER] /home/user/myapp
|- main.py
|- app.config
|- server.config
[FOLDER] /home/user/myapp/templates
[FOLDER] /home/user/myapp/templates/base
|- index.html
|- sidebar_menu.html
[FOLDER] /home/user/myapp/config
|- templates.py
在/home/user/myapp/templates
中,目录中将组织不同的模板。
在/home/user/myapp/config
下,我有以下文件:templates.py
,其代码如下:
# -*- coding: utf-8 -*-
import mako.template
import mako.lookup
# Templates
templates_lookup = mako.lookup.TemplateLookup(
directories=[
'/templates',
'/templates/base',
],
module_directory='/tmp/mako_modules',
input_encoding='utf-8',
output_encoding='utf-8',
encoding_errors='replace'
)
def serve_template(templatename, **kwargs):
mytemplate = templates_lookup.get_template(templatename)
print(mytemplate.render(**kwargs))
在/home/user/myapp
下,将存在以下main.py
文件:
# -*- coding: utf-8 -*-
import os
import cherrypy
import mako.template
import mako.lookup
import config.templates
# Main Page
class Index(object):
@cherrypy.expose
def index(self):
t = config.templates.serve_template('index.html')
print(t)
return t
cherrypy.config.update("server.config")
cherrypy.tree.mount(Index(), '/', "app.config")
cherrypy.engine.start()
启动应用程序并访问/
时,我收到以下消息:
500 Internal Server Error
The server encountered an unexpected condition which prevented it from fulfilling the request.
Traceback (most recent call last):
File "C:\Python37\lib\site-packages\mako\lookup.py", line 247, in get_template
return self._check(uri, self._collection[uri])
KeyError: 'index.html'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Python37\lib\site-packages\cherrypy\_cprequest.py", line 628, in respond
self._do_respond(path_info)
File "C:\Python37\lib\site-packages\cherrypy\_cprequest.py", line 687, in _do_respond
response.body = self.handler()
File "C:\Python37\lib\site-packages\cherrypy\lib\encoding.py", line 219, in __call__
self.body = self.oldhandler(*args, **kwargs)
File "C:\Python37\lib\site-packages\cherrypy\_cpdispatch.py", line 54, in __call__
return self.callable(*self.args, **self.kwargs)
File ".....\myapp\main.py", line 18, in index
t = config.templates.serve_template('index.html')
File ".....\myapp\config\templates.py", line 19, in serve_template
mytemplate = templates_lookup.get_template(templatename)
File "C:\Python37\lib\site-packages\mako\lookup.py", line 261, in get_template
"Cant locate template for uri %r" % uri)
mako.exceptions.TopLevelLookupException: Cant locate template for uri 'index.html'
Powered by CherryPy 18.1.0
因此,基本上,尽管我们提供了目录,但Mako似乎无法找到index.html
。我想我不了解Mako在查询中的用法。
注意:程序实际上是在Windows中运行的,我在上面使用UNIX文件结构只是为了使文件结构更易于阅读。
Python 3.7.2
CherryPy 18.1.0
Mako 1.0.7
答案 0 :(得分:0)
您声明目录结构为 / home / user / myapp / templates
但是您要告诉Mako看看 /模板
也许将代码更改为: 目录= [ '/ home / user / myapp / templates', '/ home / user / myapp / templates / base', ]
答案 1 :(得分:0)
我通常将模板分为每页模板和全局模板 例如:
agents_B.forEach((agent) => (agent.children.sort(function(a, b) {
var nameA = a.label.toUpperCase(); // ignore upper and lowercase
var nameB = b.label.toUpperCase(); // ignore upper and lowercase
if (nameA < nameB) {
return -1;
}
if (nameA > nameB) {
return 1;
}
// names must be equal
return 0;
})) );
在这种情况下,我将始终使用查找目录导入全局文件
src/
├── constants.py
├── home
│ └── user
│ └── myapp
│ ├── app.config
│ ├── main.mako
│ ├── main.py
│ └── server.config
└── templates
├── e404.mako
├── e500.mako
├── footer.mako
└── header.mako
# src/constants.py
from mako.lookup import TemplateLookup
mylookup = TemplateLookup(directories=['.', 'dir/to/src/templates/'])
# home/user/myapp/main.py
from src.constants import mylookup
def main():
if i_have_errer:
template = mylookup.get_template('e500.mako')
else:
template = mylookup.get_template('main.mako')
return template.render_unicode()
将首先在当前目录中查找
'.'
将在全局templates/
中查找更通用的模板