2013-11-02 36 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 - 管理員網頁中的內容非常簡單。)使用更多動態對象時,上面的答案適用。

相關問題