我刚开始金字塔并且在加载视图时遇到问题。我想基于从数据库中获取的变量来加载视图,例如我的PHP解决方案:rewrite url with htaccess
我已经构建了一个可以执行此操作的脚本,但我确信这不是正确的方法。我想当我在一个真实的网站上使用它时会变得非常复杂和混乱。有人可以解释一下如何正确解决这个问题吗?或者指向另一个解决方案?
我目前的剧本:
config.add_route('home', '/')
config.add_route('admin_home', '/admin')
config.add_route('admin_pages', '/admin/pages')
config.add_static_view(name='static', path='website:static')
config.add_route('view_loader', '/*url')
views.py
class ViewLoader(object):
def __init__(self, request):
self.request = request
@view_config(route_name="view_loader", renderer="templates/view_loader.pt")
def view_loader(self):
request = self.request
url = "/%s" % request.matchdict["url"]
page = DBSession.query(Pages).filter_by(url=url).one()
return dict(title=page.title, include=page.template)
view_loader.pt
<!DOCTYPE html>
<html>
<body>
<metal:main use-macro="load: ${include}"></metal:main>
</body>
</html>
系统理念:
管理员可以使用随机网址在cms中创建页面,并且必须选择模板。系统必须生成这些页面。
所以我想在调用类/方法之后渲染模板,以确定必须呈现的模板
答案 0 :(得分:0)
在这个问题Map different URLs to same view的帮助下,我找到了一个更合乎逻辑的解决方案。实际上解决方案非常简单我只是不知道可以在add_view()中声明渲染器
main.py
pages = DBSession.query(Pages)
for page in pages:
config.add_route(str(page.name), page.url)
if page.template.decode('utf-8') == "home_view":
config.add_view(home_view, route_name=str(page.name), renderer='templates/home.pt')
elif page.template.decode('utf-8') == "detail_view":
config.add_view(home_view, route_name=str(page.name), renderer='templates/detail.pt')
views.py
def home_view(self, request):
return dict(.....)