将Google应用程序引擎数据存储模型传递给javascript代码

将Google应用程序引擎数据存储模型传递给javascript代码,javascript,python,google-app-engine,templating,Javascript,Python,Google App Engine,Templating,我知道Jinja2库允许我将数据存储模型从python代码传递到html,并从html代码内部访问这些数据,如图所示。但是,Jinja2与javascript不兼容,我希望访问javascript代码中的数据。最简单的模板库是什么,它允许在Javascript中迭代我的数据存储实体?我听说过胡须和Jquery之类的东西,我觉得它们看起来有点太复杂了。还有更简单的吗?您应该创建一个python控制器,它提供JSON格式的数据,任何Javascript库(尤其是jQuery)都可以使用这些数据。然后

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

您应该创建一个python控制器,它提供JSON格式的数据,任何Javascript库(尤其是jQuery)都可以使用这些数据。然后,设置Jinja2模板,使其包含一些调用、加载和显示所述数据的Javascript。

您应该创建一个python控制器,该控制器提供JSON格式的数据,任何Javascript库(尤其是jQuery)都可以使用这些数据。然后,将Jinja2模板设置为包含一些Javascript,用于调用、加载和显示所述数据。

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

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

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

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

还有一种方法需要考虑:如果Python对象不是动态的,您可能希望使用json.dumps()将其存储为TextProperty,而只需在JS端使用json.parse(unescape(model_text))。减少开销和内存命中,这在尝试保持F1限制时非常重要。例如,我运行了一个在F1中非常容易运行的实例。我们提供了一个大型字典对象。如果该对象作为Python字典存在于实例中,那么由于软内存限制,我们将终止该实例。使用TextProperty方法,我们可以将这个大dict传递给客户机,而不会出现任何问题。(注意:在最初创建此对象时,我们确实需要暂时将实例提升到F4级,这在管理网页中非常简单。)对于更多动态对象,以上答案适用。

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

Jinja2和Javascript配合得很好。您需要安排模板扩展将Python数据结构发送到JS友好的表单中


它覆盖得相当好。(注意使用了escapejs过滤器。)

Jinja2和Javascript配合得很好。您需要安排模板扩展将Python数据结构发送到JS友好的表单中


它覆盖得相当好。(注意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))
在我的'index.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 %}
{%autoescape true%}
网页
//我在这里检索我的数据
var results=“{json_data}}”;
对于(var i=0;i”);
} 
{%endautoescape%}

它可以工作。我必须将我的数据存储实体序列化(转换)为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))
在我的'index.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 %}
{%autoescape true%}
网页
//我在这里检索我的数据
var results=“{json_data}}”;
对于(var i=0;i”);
} 
{%endautoescape%}

是,但javascript只能访问html元素及其各自的属性,而不能访问这些元素中声明的变量。此外,jinja语法可以与html代码交错,以便显示从它发送到网页的值。这在js上不起作用。我尝试过传递python列表,但无法从js访问此列表。如果你能给我一个非常好的例子,客户端的HTML不包含任何变量(比如Jinja代码)。我不理解你的评论?是的,但javascript只能访问html元素及其