I know that the Jinja2 library allows me to pass datastore models from my python code to html and access this data from inside the html code as shown in this example . However Jinja2 isn't compatible with javascript and I want to access the data inside my Javascript code . What is the simplest templating library which allows to iterate over my datastore entities in Javascript ? I've heard about things like Mustache and Jquery , I think they look a bit too complicated. Is there anything simpler?
5 回答
Jinja2 和 Javascript 一起玩得很好。您需要安排模板扩展将您的 Python 数据结构发送到对 JS 友好的表单中。
https://sites.google.com/a/khanacademy.org/forge/technical/autoescape-in -jinja2-templates 很好地涵盖了它。(注意escapejs
过滤器的使用。)
另一种需要考虑的方法:如果 Python 对象不是动态的,您可能希望使用 json.dumps() 将其存储为 TextProperty,并在 JS 端简单地使用 JSON.parse(unescape(model_text))。减少开销和内存命中,这在尝试保持在 F1 限制内时可能很重要。例如,我运行一个非常容易在 F1 中运行的实例。我们提供了一个大型字典对象。如果这个对象作为 Python 字典存在于实例中,我们会因为软内存限制而终止该实例。使用 TextProperty 方法,我们可以毫无问题地将这个大字典传递给客户端。(注意:在最初创建这个对象时,我们确实必须暂时将我们的实例提升到 F4 - 这在 Admin 网页中非常容易。)对于更多动态对象,上面的答案适用。
有用。我必须将我的数据存储实体序列化(转换)为 Javascript 很好理解的 json 格式。我创建了一个函数,它将我的数据存储的每个实例转换为一个字典,然后将所有这些实例封装到一个列表中,然后使用 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 %}
您应该创建一个提供 JSON 格式数据的 python 控制器,任何 Javascript 库(尤其是 jQuery)都可以从中使用。然后,设置 Jinja2 模板以包含一些调用、加载和显示所述数据的 Javascript。
它与兼容性无关。Jinja 是服务器端模板。您可以使用 javascript 进行客户端编码。
使用 Jinja,您可以创建 HTML,它可以像普通 HTML 一样通过 javascript 访问。要将数据存储实体发送到您的客户端,您可以使用 Jinja 传递 Python 列表或使用 json Web 服务。