将 Google App Engine 数据存储模型传递给 JavaScript 代码

Passing Google App Engine datastore models to javascript code

本文关键字:JavaScript 代码 模型 存储 Google App Engine 数据      更新时间:2023-09-26

我知道Jinja2库允许我将数据存储模型从我的python代码传递到html,并从html代码内部访问这些数据,如本例所示。但是Jinja2与javascript不兼容,我想访问我的Javascript代码中的数据。允许在 Javascript 中迭代我的数据存储实体的最简单的模板库是什么?我听说过像Mustache和Jquery这样的东西,我觉得它们看起来有点太复杂了。还有更简单的吗?

你应该创建一个python控制器来提供JSON格式的数据,任何Javascript库(特别是jQuery)都可以从中消费。然后,设置 Jinja2 模板以包含一些调用、加载和显示所述数据的 Javascript。

另一种需要考虑的方法:如果 Python 对象不是动态的,你可能希望使用 json.dumps() 将其存储为 TextProperty,只需在 JS 端使用 JSON.parse(unescape(model_text))。减少开销和内存命中,这在尝试保持在 F1 限制内时可能很重要。例如,我运行一个非常容易在 F1 中运行的实例。我们提供了一个大型字典对象。如果这个对象作为 Python 字典存在于实例中,由于软内存限制,我们将杀死该实例。使用 TextProperty 方法,我们可以毫无问题地将此大字典传递给客户端。(注意:在最初创建此对象时,我们确实必须暂时将实例提升到 F4 - 这在管理网页中非常容易。对于更多动态对象,上述答案适用。

Jinja2 和 Javascript 可以很好地协同工作。您需要安排让模板扩展将您的 Python 数据结构发出为 JS 友好的形式。

https://sites.google.com/a/khanacademy.org/forge/technical/autoescape-in-jinja2-templates 很好地涵盖了它。(请注意escapejs筛选器的使用。

它有效。我不得不将我的数据存储实体序列化(转换)为json格式,Javascript很好地理解了这种格式。我创建了一个函数,它将数据存储的每个实例转换为字典,然后将所有这些实例封装到一个列表中,然后使用 json.dumps 将其转换为 Json。当我将此结果传递给 Java 脚本时,我可以轻松地访问我的值,如下所示。

import json
import webapp2
from google.appengine.ext import db
import jinja2
JINJA_ENVIRONMENT = jinja2.Environment(
loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
extensions=['jinja2.ext.autoescape'],
autoescape=True)
# serialize datastore model to JSON format
def serialize(model):
   allInstances = model.all() # fetching every instance of model
   itemsList = [] #initial empty list
   for p in allInstances:
      d = db.to_dict(p)
      itemsList.append(d)
return  json.dumps(itemsList)
class myModel(db.Model):
    v  = db.FloatProperty()
    c = db.FloatProperty()
    tdate = db.DateTimeProperty(auto_now_add=True)
class MainPage(webapp2.RequestHandler):
    def get(self):
       myModel(v=4.5, c=3.0).put()
       #creating template variables
       template_values = {
           'json_data':  serialize(myModel)
       }
       template = JINJA_ENVIRONMENT.get_template('index.html')
       self.response.write(template.render(template_values))

在我的"索引.html"文件中,我有:

{% autoescape true %}
<!DOCTYPE html>
<html>
    <head>
        <title> webpage </title>
         <script type="text/javascript">
           // I retrieve my data here
           var results = "{{ json_data }}";
           for(var i = 0; i < db_results.length; i++) {
              document.write("myModel instance:" + i + results[i] + "<br>");
           } 
         </script>
    </head>
    <body>
    </body>
</html>
{% endautoescape %}

它与兼容性无关。Jinja 是服务器端模板化。您可以使用 javascript 进行客户端编码。

使用Jinja,您可以创建HTML,它可以像普通HTML一样通过javascript访问。要将数据存储实体发送到客户端,您可以使用 Jinja 传递 Python 列表或使用 json Web 服务。