在Pyramid中,如何从视图中返回原始HTML?

时间:2011-10-28 15:34:40

标签: python html mongodb pyramid

我是金字塔的新手(对于一般的网页框架来说还是新手)。

我正试图进入可以从视图中返回原始HTML的阶段,以便我可以标记从我的mongoDB存储返回的数据。

我的金字塔项目中的__init__.py是标准的:

def main(global_config, **settings):
""" This function returns a Pyramid WSGI application.
"""
config = Configurator(root_factory = Root, settings = settings)
config.add_view('hermesweb.views.my_view',
                context = 'hermesweb:resources.Root',
                renderer = 'hermesweb:templates/mytemplate.pt')
config.add_static_view('static', 'hermesweb:static', cache_max_age = 3600)
views.myDB = connect() # connect to my mongoDB

我的templates/mytemplate.pt看起来像这样:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" xmlns:tal="http://xml.zope.org/namespaces/tal">
<head><title>My test title. . . </title></head>
<body>
    <div>
        <h2>Perform a search</h2>
        <form method="GET" action="">
            <div>
                <input type="text" name="id"/>
            </div>
            <input type="submit" value="Submit"/>
        </form>
        <h2>Results</h2>
        ${results}
    </div>
</body
<html>

最后,我的views.py看起来像这样:

myDB = "" # ref to the database is assigned on startup.
def my_view(request):
    key = request.GET.get('id', None)
    results = ""
    if key:
        db_res = myDB.call_some_find_function(key)
        for data in db_res:
            results = "%s <li> %s </li>" % (results, data)
        results = "<ul> %s </ul>" % results

    return {'results': results}

当我在表单中插入一个术语并且my_view函数被调用时,数据库被查询并且正确的结果被拉出,但是,而不是返回的字符串变成网页中的html,它是而是在网页上打印成一个字符串。

我怀疑这与内容类型有关?但我还不太了解金字塔。有人可以解释如何让这个返回由浏览器解释为html的html,而不仅仅是一个字符串吗?

额外的问题 - 我是否应该使用views.py进行此类型的数据库调用?我仍然对整个Root对象进入它的地方感到困惑。我正在使用MongoDB作为数据库后端。 。

2 个答案:

答案 0 :(得分:6)

为了防止变色龙逃离${result}变量,您需要使用${structure: result},根据文档:http://chameleon.readthedocs.org/en/latest/reference.html#structure

答案 1 :(得分:0)

字符串正在转义,这是插入到模板中的字符串的默认值,以防止将顽皮代码注入您的网站。要将字符串标记为安全,您需要将其标记为文字,以便它不会被转义。我相信金字塔(如pylons)附带webhelpers模块,因此您可以导入文字函数:

from webhelpers.html import literal

然后将您的最终结果分配替换为:

results = literal("<ul> %s </ul>" %results)

如果我怀疑文字不附带金字塔,请参阅此帖子: Python Pyramid & Chameleon templating language escapes html

编辑:请注意,为了安全起见,您应该在将数据输入html之前从数据库中转义数据。您可以使用cgi.escape