Вот рабочая пробная версия для одного подхода:
from flask import Flask, render_template_string, session, request
import pandas as pd
app = Flask(__name__)
template = """
<!doctype html>
<input type="text" value="" name="my_filter" id="my_filter">
<div id="results">{{ data|safe }}</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript">
$('#my_filter').keyup(function() {
if ($(this).val().length >= 1) {
var requested_code = document.getElementById('my_filter').value;
$.ajax({
type: 'POST',
data: JSON.stringify({
'requested_code': requested_code
}),
contentType: 'application/json; charset=utf-8',
url: "{{ url_for('filter_html') }}",
success: function(resp) {
$("#results").html(resp);
}
});
}
});
</script>
</html>
"""
@app.route("/")
def table():
df = pd.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6]})
session['df'] = df.values.tolist()
return render_template_string(template, data=df.to_html(index=False))
@app.route('/filter', methods=['GET', 'POST'])
def filter_html():
df = pd.DataFrame(session['df'], columns=['a', 'b'])
df = df[df['a'] == int(request.json.get('requested_code'))]
return df.to_html(index=False)
if __name__ == '__main__':
app.secret_key = 'hello'
app.run(debug=True)
По сути, добавьте функцию JQuery в поле input
, которое ищет события keyup
.Однако они должны инициировать AJAX-запрос к конечной точке URL во Flask, которая затем может обновить "results"
div.Могут быть более чистые способы сериализации данных, которые будут сохранены в сеансе;это просто для иллюстрации подхода.
Значение по умолчанию session
довольно мало во Flask.Если вы попытаетесь сохранить объект, который слишком велик, чтобы уместиться, это не приведет к ошибке, проблема просто игнорируется.Вы захотите использовать flask-session
для хранения данных DF;в настоящее время вы отправляете все это в браузер, поэтому я предполагаю, что оно не особенно велико.
Для тех, кто менее знаком с Flask, но работает с Pandas: вы можете запустить этот код и затем перейти к 127.0.0.1:5000
в вашембраузер.Числа 1, 2 или 3 действительны для ввода в поле поиска для взаимодействия с df, все остальное приводит к пустому df.