Python/Flask/HTML — отображать HTML в новом окне вместо домашней страницы

У меня есть код Python, в котором я использую Flask для создания веб-страницы. На домашней странице я заполняю форму, отправляю ее с помощью кнопки, и она отображает таблицу на основе входных данных.

Проблема, с которой я столкнулся, заключается в том, что как только я нажимаю кнопку, чтобы отправить форму, она отображает таблицу на той же веб-странице. я хотел бы создать новое окно, используя JavaScript window.open() или любой другой метод, который вы могли бы предложить, чтобы отобразить эту таблицу внутри нового окна и оставить домашнюю страницу как есть. Я попытался осмотреться, и я не могу заставить что-либо работать. Я прочитал этот вопрос и этот вопрос. Но эти предложения, похоже, не соответствуют тому, что я ищу.

Это мой код:

Код Python

from flask import Flask, render_template, request,
app = Flask(__name__)

def get_table(user_input):
...
return dict    //returns list of dictionaries, for example... 
               //dict = [{'name':'Joe','age':'25'},
               //        {'name':'Mike','age':'20'}, 
               //        {'name':'Chris','age':'29'}] 



@app.route("/")
def home():
    return render_template('home.html')


@app.route("/table", methods = ['POST'])
def table():
    user_input = request.form['input']
    dict_table = get_table(user_input)     //return list of dictionaries
    return render_template('table.html', dict_table=dict_table)

if __name__ == '__main__':
    app.run(debug=True)

home.html

<!DOCTYPE html>
<html>
<head>
   <title>Homepage</title>
</head>
<body>
        <form action = "/table" method = "post">
            <select name = "input">
               <option value = "1">Input</option>
            </select>
           <button type = "submit">Click Me!</button>
        </form>
</body>
</html>

таблица.html

<!DOCTYPE html>
<html>
<head>
   <title>Table</title>
</head>
<body>
        <table id = "table">
        {% if dict_table %}
        <tr>
            {% for key in dict_table[0] %}
                <th>{{ key }}</th>
            {% endfor %}
        </tr>
        {% endif %}

        {% for dict in dict_table %}
        <tr>
            {% for value in dict.values() %}
                <td>{{ value }}</td>
            {% endfor %}
        </tr>
        {% endfor %}
    </table>
</body>
</html>

Может ли кто-нибудь объяснить, как я могу нажать кнопку отправки формы на моей домашней странице, оставайтесь на домашней странице home.html и сделайте так, чтобы таблица из table.html открывалась в новом окне (возможно, используя window.open() из JavaScript или что-то еще)?

Я был бы признателен, если бы кто-нибудь мог рассказать мне, как это сделать с моим кодом, и показать мне, где конкретно вызывать функции и тому подобное. Я новичок в Flask/HTML/JS, и я просто пытаюсь учиться для личного использования, и я разочаровываюсь, читая ссылки и документы, которые показывают, как отображать URL-адрес, например google.com, в новой вкладке, чего я не хочу. Спасибо. !

попробуйте этот stackoverflow.com/questions/3951768/…

Đào Minh Hạt 21.02.2019 05:52

Нравится? stackoverflow.com/questions/44606429/…

gittert 21.02.2019 07:57
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
2
8 235
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Шаг 1: Проверьте эту ссылку, которая объясняет, как использовать Jquery и Ajax с FLASK.

Ключевой концепцией здесь является AJAX (асинхронный JavaScript и XML). Короче говоря, это архитектура, которая позволяет отправлять запросы на сервер в фоновом режиме (так называемые асинхронные запросы), а затем изменяет содержимое страницы, отображаемой в данный момент веб-браузером, в соответствии с результатом, полученным от сервера, избегая так как сервер не передает полную страницу снова.

Шаг 2: Решение вашей проблемы

  • Сначала пишем маршруты:

    from flask import Flask, render_template, request,
    app = Flask(__name__)
    
    user_input = None
    
    def get_table(user_input):
        ...
        return dict    //returns list of dictionaries, for example... 
                       //dict = [{'name':'Joe','age':'25'},
                      //        {'name':'Mike','age':'20'}, 
                      //        {'name':'Chris','age':'29'}] 
    
    @app.route('/')
    def home():
        return render_template('home.html')
    
    @app.route('/_ajax_user_input')
    def ajax_user_input():
         global user_input
         user_input = request.args.get('user_input', 0, type=int)
         return "ok"
    
    @app.route("/table")
    def table():
        x = user_input
        dict_table = get_table(x)     //return list of dictionaries
        return render_template('table.html', dict_table=dict_table)
    
  • После того, как мы атакуем шаблоны:

    • home.html:

      <select id = "input" name = "input">
          <option value = "1">Input</option>
      </select>
      <button type = "button" class = "test"> Click Me! </button>
      
      <script>
          $(document).ready(function(){
              $('.test').bind('click', function() {
                  $.getJSON($SCRIPT_ROOT + '/_ajax_user_input',{
                      user_input: $('#input').val(),
                  },function() {
                      window.open('http://127.0.0.1:5000/table', '_blank');
                  });
                  return false;
              });
          });
      </script>
      
    • таблица.html:

      <table id = "table">
          {% if dict_table %}
              <tr>
                  {% for key in dict_table[0] %}
                      <th>{{ key }}</th>
                  {% endfor %}
              </tr>
          {% endif %}
      
          {% for dict in dict_table %}
              <tr>
                  {% for value in dict.values() %}
                      <td>{{ value }}</td>
                  {% endfor %}
              </tr>
          {% endfor %}
      </table>
      

В основном вот что происходит:

  • когда я нажимаю на свою кнопку, я вызываю сценарий Javascript:

     $('.test').bind('click', function() {
    
  • Это отправляет ajax-запрос к FLASK, который заключается в выполнении функции ajax_user_input():

     $.getJSON($SCRIPT_ROOT + '/_ajax_user_input',
    
  • В эту функцию я отправляю данные (значение, выбранное пользователем в теге select), и эти данные сохраняются в переменной user_input:

     user_input: $('#input').val(),
    
  • На стороне Flask я получаю данные и сохраняю их в глобальной переменной, которую я тоже назвал user_input:

     global user_input
     user_input = request.args.get('user_input', 0, type=int)
    
  • Затем в моем сценарии я вызываю метод javascript, который позволяет мне открывать URL-адрес в новой вкладке (подробнее здесь):

     window.open('http://127.0.0.1:5000/table', '_blank');
    
  • Маршрут «таблица» сохраняет в переменной x данные, ранее сохраненные в моей глобальной переменной (user_input), затем вызывает функцию получить_таблицу() (передавая ему переменную x в параметре), которая возвращает список словарей, и, наконец, возвращает страницу таблица.html со списком словарей в параметре:

     x = user_input
     dict_table = get_table(x)
     return render_template('table.html', dict_table=dict_table)
    

Я надеюсь, что это поможет вам, хотя я убежден, что есть много других способов сделать это, возможно, более эффективных.

Привет, Тобин, спасибо за подробный ответ, но, читая это, я понял, что неправильно сформулировал свой вопрос. Я внес изменения, чтобы исправить это. Я хотел открыть table.html в «новом» окне, а не во всплывающем окне. Я не должен был называть это всплывающим окном. Я хотел открыть его в новой вкладке или новом окне. Могу ли я это сделать?

ss1111 22.02.2019 00:21

@ ss1111 Я только что отредактировал свой ответ. Я надеюсь, что на этот раз это удовлетворит вашу озабоченность. В случае проблем, не стесняйтесь оставлять комментарии

Tobin 22.02.2019 14:04

Я прочитал и понял, как работает ваш код, и теперь он мне понятен. Но когда я попробовал и нажал кнопку "Click Me!" Кнопка, похоже, ничего не делает. Есть ли что-то, что я делаю неправильно? Когда вы попробовали это, это сработало для вас? Если это так, у меня должна быть синтаксическая ошибка где-то на моей стороне.

ss1111 23.02.2019 19:32

Действительно, когда я тестирую, он работает очень хорошо. Где-то в вашем коде должна быть синтаксическая ошибка, или вы, возможно, забыли импортировать Jquery. Я предлагаю вам использовать инспектор вашего браузера, чтобы убедиться, что запрос Ajax работает правильно.

Tobin 25.02.2019 15:57

В случае беспокойства особенно не стесняйтесь добавить комментарий. Но я очень уверен, что проблема должна исходить от ваших манипуляций с javascript; обязательно импортируйте jquery перед тегом body, проверьте точки с запятой в коде javascript, при необходимости добавьте «console.info» и проверьте в консоли, реагирует ли он. это позволит вам увидеть, успешны ли запросы Ajax.

Tobin 25.02.2019 16:02

Другие вопросы по теме