我是金字塔的新手(对于一般的网页框架来说还是新手)。
我正试图进入可以从视图中返回原始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作为数据库后端。 。
答案 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
。