将 Google App Engine 数据存储模型传递给 JavaScript 代码
Passing Google App Engine datastore models to javascript code
我知道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 服务。
- 如何在读取XLS/XLSX本地文件时,使用IE的javascript代码启用未标记为安全的ActiveX控件
- 面向对象的Javascript代码在IE7中不起作用
- 通过命令行/批处理文件打开页面时,将javascript代码注入Google Chrome
- JavaScript代码问题:我正在将对象转换为数组
- Javascript阻止其他Javascript代码
- JavaScript代码未正确检查ajax请求
- 如何调试Javascript代码或函数
- 为什么我在这个javaScript代码中使用NaN
- 将javascript代码转换为jquery代码时出错
- 如何从Objective-C代码中调用javascript代码
- 有什么工具可以轻松读取javascript代码吗
- 这个javascript代码是如何编写的
- 如何解密此javascript代码
- SIMPLE Javascript代码,用于显示谷歌电子表格中单个字段的数据
- HTML标记,包含带引号的JavaScript代码中的引号
- 如何在Win8Metro应用程序的Javascript代码中捕获自己的C#事件
- addEventListener的Javascript代码不工作!?(单击时打开放大的img)
- JavaScript代码无法在表单上呈现部分
- 以下 JavaScript 代码与 Facebook 相关
- 使用解析为javascript源的.php,如何使用条件语句将javascript代码封装在php括号之间