Appengine Django 模板 - 读取模板标签

Posted

技术标签:

【中文标题】Appengine Django 模板 - 读取模板标签【英文标题】:Appengine Django Template - Read template tags 【发布时间】:2011-05-13 14:22:22 【问题描述】:

更新 1 添加更新代码

我在应用引擎上有一个 django 模板。目前我所有的数据都在几个模板中,我想从磁盘上读取模板。非常简单,但我想从 AppEngine 中的这些模板中获取值。

例如。文件:p1.html

%block price%$259%endblock%  
%block buy%http://www.highbeam.co.nz/store/index.php?route=product/product&path=6&product_id=116%endblock%  
%block info%http://www.inov-8.co.nz/oroc280.html%endblock%    

我可以将这些模板加载并读取为某个值并继续。

template['price']

应该是

259 美元

我可以轻松地将数据注入模板,但我想解析出块标签之间的数据。

更新 2 在 aaronasterling(谢谢)的帮助下,最终代码是这样的。 从应用引擎上的 Django 模板中获取值的最终代码。 path = os.path.join(os.path.dirname(file), 'home/p2.html')

    file = open(path)
    entry = file.read()
    file.close()   
    entry = entry.replace("% extends \"product.html\" %","")   

    t = Template(entry) 

    product = 
    for node in t.nodelist[0].nodelist  :   
       if hasattr(node, 'name'):
          product[node.name] = node.render(Context()) 

【问题讨论】:

“我所有的数据都在几个模板中” - 我不明白这一点。为什么模板中有数据? 它就像当今最好的 MVC 架构与 1996 年的网站相结合。 将所有数据放入模板并放入 Dropbox 以供我的项目经理编辑非常容易 - 只有 15 页数据,将所有这些数据放入数据库中是多余的。 你知道什么会更容易吗?一个 Excel 文件。经理喜欢excel。程序员也喜欢 excel,因为他们可以将其转换为 CSV。 DBA 就像 CSV 一样,因为他们可以将其直接导入数据库。 我仍然认为这是一个好方法。也许我可以将我的数据渲染到不同的模板中,例如 [%block price%%end block%] 并从那里开始。 【参考方案1】:

Update 1固定遍历整个节点树。

Update 2实际测试过,现在可以了。

这是一种方法。

from django.template import Template, Context

t = Template(template_string) # get it with open(filename).read() I guess


def get_block_contents(t, block_name, context=None):
    if context is None:
        context = Context()
    stack = t.nodelist[:]
    while stack:
        node = stack.pop()
        if hasattr(node, 'name') and node.name == block_name:
            return node.render(context)
        if hasattr(node, 'nodelist'):
            stack.extend(node.nodelist)
    return False # Or raise an error

【讨论】:

嗨,我知道我们正在接近。我收到 AttributeError: 'Main' object has no attribute 'name' @John,你使用的是什么版本的 django? 如果是原生应用引擎,那么很可能是 0.96 Appengine 是 Python 2.5,我不能 100% 确定它是哪个版本的 Django。【参考方案2】:

听起来你好像中枪了。让我们假装我们不应该受到责备并解决它:

entry = """%block price%$259%endblock%  
%block buy%http://www.highbeam.co.nz/store/index.php?route=product/product&path=6&product_id=116%endblock%  
%block info%http://www.inov-8.co.nz/oroc280.html%endblock%   """

parsedentry = dict([(j[0].split(' ')[-1], j[-1]) for j in [i.partition("%") for i in entry.split("%endblock%")] if j[0].split(' ')[-1]])

print parsedentry['price']

【讨论】:

这就像一个魅力!我认为它可能只是归结为一个令牌/字符串解析器。我确实喜欢使用 djangos 模板解析器的 aaronasterlings 方法。

以上是关于Appengine Django 模板 - 读取模板标签的主要内容,如果未能解决你的问题,请参考以下文章

python app-engine django 1.2上的TemplateDoesNotExist,同时模板呈现绝对路径

如何使用带有 python 的 App Engine 国际化 Django HTML 模板?

在 appengine 上处理禁用 cookie 的简单方法是啥?

什么是 appengine_config.py

如何在java appengine中将代码与html分开?

Google App Engine 中的 Django 模板语法错误