загрузка прокрутки в стиле twitter для страницы flask stream_with_context

#javascript #jquery #python #flask

#javascript #jquery #python #flask

Вопрос:

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

 @search.route('/')
def properties_search():
    if len(request.args) > 0:
        d = CSVReader()
        row_count = len(list(search_csv(d, request.args)))
        gen = stream_with_context(search_csv(d, request.args))
        return Response(
            stream_with_context(
                stream_template(
                    'advanced_search/results.html',
                    rows=gen
                )
            )
        )
    return render_template('advanced_search/advanced.html')

def search_csv(rows, form):
    for row in rows:
        if satisfies_all_requirements(row, form):
            yield row
 

Однако, когда это попадет на страницу, она продолжит отображать каждый результат без остановки.

 <div class="results">
  {% for each in rows %}
    {# blah blah some html goes here, you get the point #}
  {% endfor %}
</div>
 

как можно включить бесконечную прокрутку в этом шаблоне, чтобы он не отображал каждый отдельный результат при первом попадании?

Комментарии:

1. это было довольно давно, но в конечном итоге я установил ограничение на объем данных, которые можно отправлять, и использовал pg-query-stream для записи его в сокет, на который клиент будет отвечать с помощью javascript

Ответ №1:

Это отдельная концепция от потоковой передачи вашего ответа. Вместо этого создайте маршрут, который вернет другой фрагмент данных, возможно, в формате JSON, и используйте JavaScript на стороне клиента, чтобы вызвать этот маршрут, когда страница прокручивается до конца, и вставить данные соответствующим образом.

 @app.route('/')
def index():
    # this page just loads the start page containing the javascript that will load more results
    # you could pre-load the first set of data so the page renders something at first
    data = get_some_data()
    return render_template('index.html', data=data)

@app.route('/more')
def more():
    # this route will only be called from JavaScript when the page is scrolled

    # read query parameters to know what data to get
    page = request.args.get('page', 1)
    per_page = request.args.get('per_page', 20)

    # get the requested set of data
    data = get_some_data(page, per_page)

    # return it as json
    return jsonify(data=format_data_appropriate_for_jsonify(data))