У меня есть код 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/44606429/…



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Шаг 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 Я только что отредактировал свой ответ. Я надеюсь, что на этот раз это удовлетворит вашу озабоченность. В случае проблем, не стесняйтесь оставлять комментарии
Я прочитал и понял, как работает ваш код, и теперь он мне понятен. Но когда я попробовал и нажал кнопку "Click Me!" Кнопка, похоже, ничего не делает. Есть ли что-то, что я делаю неправильно? Когда вы попробовали это, это сработало для вас? Если это так, у меня должна быть синтаксическая ошибка где-то на моей стороне.
Действительно, когда я тестирую, он работает очень хорошо. Где-то в вашем коде должна быть синтаксическая ошибка, или вы, возможно, забыли импортировать Jquery. Я предлагаю вам использовать инспектор вашего браузера, чтобы убедиться, что запрос Ajax работает правильно.
В случае беспокойства особенно не стесняйтесь добавить комментарий. Но я очень уверен, что проблема должна исходить от ваших манипуляций с javascript; обязательно импортируйте jquery перед тегом body, проверьте точки с запятой в коде javascript, при необходимости добавьте «console.info» и проверьте в консоли, реагирует ли он. это позволит вам увидеть, успешны ли запросы Ajax.
попробуйте этот stackoverflow.com/questions/3951768/…