Как запросить хранилище данных на python и опубликовать в шаблоне jinja2?

#python #google-app-engine #jinja2

#python #google-app-engine #jinja2

Вопрос:

Я пытаюсь создать форму, в которой пользователь может ввести адрес стадиона, отправить форму, запросить хранилище данных 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')
  

Ответ №1:

В вашем коде есть несколько ошибок, но, вероятно, проще всего привести пример того, что нужно сделать.

Создайте шаблон, подобный этому (в «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)))
  

Я не тестировал это, но это должно, по крайней мере, приблизить вас к исправлению вашего кода.

Ответ №2:

Возможно, вы захотите рассмотреть возможность использования 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')