【问题标题】:How to I query a datastore in python and post to a jinja2 template?如何在 python 中查询数据存储并发布到 jinja2 模板?
【发布时间】:2017-03-05 17:54:29
【问题描述】:
我正在尝试创建一个用户可以输入体育场地址的表单提交表单,查询 Google App Engine 数据存储并确认地址正确,然后发布到地址正确的 jinja2 模板或这些是离该点最近的地址。我正在使用 python。
这是课程:
class Search(webapp2.RequestHandler):
def get(self):
addressNumber = self.request.get('addressNumber')
streetName = self.request.get('streetName')
unitNumber = self.request.get('unitNumber')
city = self.request.get('city')
state = self.request.get('state')
zipCode = self.request.get('zipCode')
q = BigView.query()
q = q.filter(BigView.addressNumber == addressNumber)
q = q.filter(BigView.streetName == streetName)
q = q.filter(BigView.unitNumber == unitNumber)
q = q.filter(BigView.state == state)
q = q.filter(BigView.city == city)
q = q.filter(BigView.zipCode == zipCode)
results = q.fetch(10)
for pickview in results:
self.response.out.write('<blockquote>%s</blockquote>' % cgi.escape(q.addressNumber))
self.render('searchindex.html')
【问题讨论】:
标签:
python
google-app-engine
jinja2
【解决方案1】:
您可能需要考虑使用 AJAX。 Jinja2 更像是一种模板语言,并不意味着动态用户交互。因此,如果您想返回服务器进行验证,我认为它是使用 Ajax 的方式。因此,当用户提交表单中的数据时,数据将被发送到服务器,并在成功时显示地址正确。
*我在下面使用 Flask 进行演示;但这个概念应该适用。
类似于以下内容:
假设你的 html 是:
<script type=text/javascript>
$SCRIPT_ROOT = {{ request.script_root|tojson|safe }};
$(function() {
$('a#validateAddress').bind('click', function() {
$.getJSON($SCRIPT_ROOT + '/validate_address', {
a: $('input[name="address"]').val()
}, function(data) {
$("#result").text(data.result);
});
return false;
});
});
</script>
<h1>jQuery Example</h1>
<p><input type=text size=5 name=address>
<span id=result>?</span>
<p><a href=# id=validateAddress>Validate Address in DB</a>
在您的服务器端(使用 Flask 显示):
from flask import Flask, jsonify, render_template, request
app = Flask(__name__)
@app.route('/validate_address')
def validate_address():
address_from_client = request.args.get('address')
**#Hit Your DB Here and Verify address is Right** the code above you wrote
return jsonify(result="Valid")
@app.route('/')
def index():
return render_template('index.html')
【解决方案2】:
您的代码中有一些错误,但可能最容易给您一个示例来说明如何操作。
创建一个这样的模板(在“templates/searchindex.html”中):
<html>
<body>
{% for result in results %}
<blockquote>{{ result }}</blockquote>
{% endfor %}
<body>
</html>
您需要通过将此代码放在文件顶部(所有类之外)来初始化 Jinja:
JINJA_ENVIRONMENT = jinja2.Environment(
loader=jinja2.FileSystemLoader("templates"), # This is the directory where you store your templates
autoescape=True
)
然后像这样在你的代码中使用模板:
results = q.fetch(10)
template = JINJA_ENVIRONMENT.get_template("searchindex.html")
self.response.write(template.render(dict(results=results)))
我还没有对此进行测试,但它至少应该能让你接近修复你的代码。