Сделайте POST-запрос клиента к конечной точке Flask render_template - PullRequest
1 голос
/ 05 июля 2019

После долгих поисков здесь и в Интернете я не смог найти то, что мне нужно.Вот искаженный минимум проверяемого примера моей проблемы.

Чтобы установить фон для проблемы, вот фактический вариант использования, который я намереваюсь реализовать.На конечной точке /heatmap есть тепловая карта, пользователи могут щелкнуть ячейки, и они должны быть перенаправлены на другую конечную точку /more-info-on-cell.В зависимости от выбранной ячейки, пользователь получит разные результаты.Я почти получил ожидаемый результат.Единственная проблема заключается в том, что страница на самом деле неправильно отображается, потому что javascript /more-info-on-cell по какой-то причине не выполняется.

Вот структура папок, которая вам требуется для этого примера:

root
|-templates
|  -index.html
|  -page.html
|-index.py

А вот и файлы: index.html

  <!DOCTYPE html>
  <html>
  <head> 
  <title>Title of the document</title> 
  </head>

  <body>
      <a id="clickMe" style="cursor: pointer">Click here to send POST to render template on the backend</a>
  </body>

  <script 
    src="https://code.jquery.com/jquery-3.4.1.min.js" 
    integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" 
    crossorigin="anonymous"></script>
  <script>
      $(document).ready(function() {
          $("#clickMe").on('click', function() {
              console.log('clicked, making a request')

              $.ajax({
                  type: 'POST',
                  url: '/',
                  data: JSON.stringify({}),
                  contentType: 'application/json',
                  success: function(response) { window.document.write(response);  }
              })
          })
      })
  </script>

  </html>

page.html

 <!DOCTYPE html>
 <html>
 <head>
 <title>Title of the document</title>
 </head>

 <body>
 The content of the document......
 </body>

 <script
   src="https://code.jquery.com/jquery-3.4.1.min.js"
   integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
   crossorigin="anonymous"></script>
     <script>
         $(document).ready(function() {
             alert('the doc is ready');
         })
     </script>

 </html>

index.py

 #!/usr/bin/env python3
 from flask import Flask, request, render_template, jsonify
 app = Flask(__name__)

 @app.route("/", methods=["GET", "POST"])
 def index():
     if request.method == "GET":
         return render_template('index.html')
     elif request.method == "POST":
         return render_template('page.html')

Вы можете проверить, чтоесли вы нажмете на ссылку в index.html, вы будете успешно перенаправлены на page.html, но его javascript никогда не будет выполнен.И поэтому вы никогда не получите предупреждение, которое мы определили в page.html.

Проблема должна быть решена путем полной работы здесь с бэкэндом фляги, поскольку шаблоны в моем реальном сценарии использования также содержат переменные jinja.,Все работает отлично, если вы делаете запрос через form с методом, имеющим правильный URL-адрес, и действием является POST.Хотя, как только я начинаю делать POST-запросы для javascript-клиента, это работает, когда я попадаю на нужную страницу, но она отображается неправильно + javascript для готового документа никогда не выполняется.

1 Ответ

0 голосов
/ 05 июля 2019

Для тех, у кого есть такой вариант использования, убедитесь, что вы используете метод post, как показано ниже (в этом случае поместите его внутри index.html):

  <script>
      $(document).ready(function() {
          $("#clickMe").on('click', function() {
              console.log('clicked, making a request')

             post('/', {'key-1': 'val-1'});
          })
      })

 function post(path, params, method='post') {
     const form = document.createElement('form');
     form.method = method;
     form.action = path;

     for (const key in params) {
         if (params.hasOwnProperty(key)) {
             const hiddenField = document.createElement('input');
             hiddenField.type = 'hidden';
             hiddenField.name = key;
             hiddenField.value = params[key];

             form.appendChild(hiddenField);
         }
     }

     document.body.appendChild(form);
     form.submit();
 }
  </script>

Это создает скрытую форму на веб-странице, а затем отправляет форму, после чего колба обрабатывает все должным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...