【问题标题】:Google App Engine--Dynamically created templatesGoogle App Engine--动态创建的模板
【发布时间】:2010-10-19 04:37:11
【问题描述】:

我正在尝试为我的应用程序构建一个简单的 CRUD 管理部分。基本上,对于给定的模型,我希望通过模型的属性将模板循环到一个简单的表中(一旦我这样做,我实际上可以实现 CRUD 部分)。实现此目的的一种可能方法是动态生成一个模板,其中包含特定于该模型的所有必要模板标签。

伪代码:

def generate_tamplate(model):
     template.write("<table border='1'>")
     template.write("<tr>")
     for attribute in model:
          template.write("<td>%s</td>" % attribute)
     template.write("</tr>")
     template.write("<tr>")
     for attribute in model:
          template.write("<td>{{ %s.%s }}</td>" % model.attribute)
     template.write("</tr>")
     template.write("</table>")

生成正确的文本应该不难。我可以按照我的伪代码模型用 Python 来做。我想知道两件事: 1) 我可以使用 Django 的模板语言来代替吗?即使用模板生成模板 2) 生成文本后,如何将其写入 webapp 的模板加载器可以访问的文件?

我记得不久前看到一些关于从数据库加载模板的内容。 GAE 可以做到这一点吗?

谢谢!

【问题讨论】:

标签: python google-app-engine templates django-templates


【解决方案1】:

不久前我看到了这个开源项目: http://code.google.com/p/gae-django-dbtemplates/

使用模板生成模板应该没问题。只需将模板呈现为字符串。这是我使用的一些代码,因此我可以将一些 xml 粘贴到 memecache 中

path = os.path.join(os.path.dirname(__file__), 'line_chart.xml')
xml = template.render(path, template_values)

您可以轻松地做一些非常相似的事情并将结果粘贴到数据存储中。

【讨论】:

    【解决方案2】:

    是的,您可以生成下一个模板,而不是 template.writes,因为 template.render(...) 只返回文本。然后您可以存储返回的文本并将其放入 DataStore,然后稍后检索它并在其上调用 .render(Context(...)) 以返回您要生成的 html。

    您无法将生成的模板写入文件 - 因为 AppEngine 应用程序没有文件系统的写入权限,只有读取权限。

    如果您将“generate_tamplate”函数更改为使用模板,伪代码可能如下所示:

    from google.appengine.ext.webapp import template
    
    def generate_tamplate(model):
        t = template.render(path_to_template1.html, Context({'model':model}))
        DataStoreTemplate(template=t, name=model.name).put()
    
    ''' Later, when you want to generate your page for that model '''
    def generate_page(model):
        t = DataStoreTemplate.all().filter("name =",model.name).get().template
        htmlresult = t.render(Context({'model':model}))
        return htmlresult
    

    【讨论】:

      【解决方案3】:

      在我看来,可以大大简化为 GAE 编写应用程序的其他选项是使用用户其他模板语言,例如 Mako,它允许您在模板中嵌入 Python 代码,因此无需摆弄。 您将模型数据传递给模板(就像template.render(template_file, model=model 一样简单),模板看起来像这样:

      <table border='1'>
        <tr>
            % for attribute in model:
              <td>${attribute}</td>
            % endfor
        </tr>
        <tr>
            % for attribute in model:
              <td>${model.attribute}</td>
            % endfor
        </tr>
      </table>
      

      我关注 this googled blog entry 将 Mako 加入我的应用程序 - 它非常简单,而且效果很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-09
        • 2011-04-25
        • 2013-09-20
        • 2019-02-09
        • 1970-01-01
        • 2011-05-08
        • 2012-09-14
        相关资源
        最近更新 更多