【问题标题】: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)))
      

      我还没有对此进行测试,但它至少应该能让你接近修复你的代码。

      【讨论】:

        猜你喜欢
        • 2015-08-31
        • 2017-06-23
        • 2017-11-09
        • 1970-01-01
        • 1970-01-01
        • 2015-12-05
        • 2020-09-21
        • 2017-03-01
        • 1970-01-01
        相关资源
        最近更新 更多