我通过 mod_wsgi 用 Apache 设置了 Python 3.2。我有 CherryPy 3.2 提供一个简单的“Hello World”网页。在构建网站时,我想开始使用 Jinja2 进行模板化。我是 Python 新手,因此对 Python、CherryPy 或 Jinja 了解不多。
使用下面的代码,我可以加载站点根目录 ( /
) 和产品页面 ( /products
) 及其基本文本。这至少让我知道我已经正确设置了 Python、mod_wsgi 和 CherryPy。
因为该站点将有很多页面,所以我想以一种无需在每个页面处理程序类中声明和呈现模板的方式来实现 Jinja 模板。据我所知,最好的方法是包装 PageHandler,类似于以下示例:
- http://docs.cherrypy.org/dev/concepts/dispatching.html#replacing-page-handlers
- http://docs.cherrypy.org/stable/refman/_cptools.html#cherrypy._cptools.HandlerWrapperTool
我已经实现了第二个示例中的代码,但它并没有改变任何东西。
[代码后的更多细节]
wsgi_handler.py -一些教程和示例的混搭
import sys, os
abspath = os.path.dirname(__file__)
sys.path.append(abspath)
sys.path.append(abspath + '/libs')
sys.path.append(abspath + '/app')
sys.stdout = sys.stderr
import atexit
import threading
import cherrypy
from cherrypy._cptools import HandlerWrapperTool
from libs.jinja2 import Environment, PackageLoader
# Import from custom module
from core import Page, Products
cherrypy.config.update({'environment': 'embedded'})
env = Environment(loader=PackageLoader('app', 'templates'))
# This should wrap the PageHandler
def interpolator(next_handler, *args, **kwargs):
template = env.get_template('base.html')
response_dict = next_handler(*args, **kwargs)
return template.render(**response_dict)
# Put the wrapper in place(?)
cherrypy.tools.jinja = HandlerWrapperTool(interpolator)
# Configure site routing
root = Page()
root.products = Products()
# Load the application
application = cherrypy.Application(root, '', abspath + '/app/config')
/应用程序/配置
[/]
request.dispatch: cherrypy.dispatch.MethodDispatcher()
核心模块类
class Page:
exposed = True
def GET(self):
return "got Page"
def POST(self, name, password):
return "created"
class Products:
exposed = True
def GET(self):
return "got Products"
def POST(self, name, password):
return "created"
根据我在Google Group上阅读的内容,我认为我可能需要“打开”Jinja 工具,因此我将配置更新为:
/应用程序/配置
[/]
tools.jinja.on = True
request.dispatch: cherrypy.dispatch.MethodDispatcher()
更新配置后,站点根目录和产品页面显示 CherryPy 生成的错误页面“500 Internal Server Error”。在日志中没有找到详细的错误消息(至少在我知道的日志中没有)。
除非它是预先安装的,否则我知道我可能需要那里的Jinja 工具,但我不知道把它放在哪里或如何启用它。我怎么做?
我是以正确的方式解决这个问题,还是有更好的方法?
编辑(2012 年 5 月 21 日):
这是我正在使用的 Jinja2 模板:
<!DOCTYPE html>
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
<h1>Hello World</h1>
</body>
</html>