Python Pyramid:基于数据库变量加载视图

时间:2013-10-10 15:03:39

标签: python view pyramid

我刚开始金字塔并且在加载视图时遇到问题。我想基于从数据库中获取的变量来加载视图,例如我的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中创建页面,并且必须选择模板。系统必须生成这些页面。

  • url = / random / random - &gt;在db中寻找模板 - &gt;渲染template_1
  • url = / random2 / random2 - &gt;在db中寻找模板 - &gt;渲染template_2

所以我想在调用类/方法之后渲染模板,以确定必须呈现的模板

1 个答案:

答案 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(.....)