2013-11-02 77 views
1

我知道的Jinja2库允许我从我的Python代码的HTML和如图所示in this example从HTML代码中访问这些数据通过数据存储模型。然而Jinja2与javascript不兼容,我想访问我的Javascript代码中的数据。什么是最简单的模板库允许在Javascript中迭代我的数据存储实体?我听说过Mustache和Jquery,我认为它们看起来有些复杂。有什么更简单的吗?传递谷歌App Engine数据存储模型的javascript代码

回答

2

它的工作原理。我不得不将序列化(转换)我的数据存储实体为json格式,该JavaScript很好理解。我创建了一个函数,将我的数据存储区的每个实例转换为一个dictionnary,然后将所有这些实例封装到一个列表中,然后使用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 %} 
2

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

0

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

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

+0

是的,但是JavaScript可以这些元素内声明只能访问HTML元素和它们各自的属性不变量。也可以将jinja语法与html代码交错,以显示从它发送到网页的值。这不适用于js – df611

+0

我试过传递一个python列表,但我无法从js访问这个列表。如果你能给我看一个非常好的例子 – df611

+0

客户端的HTML不包含任何变量(比如Jinja代码)。我不明白你的意见? – voscausa

2

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

相关问题