Можно ли обновить веб-страницу с помощью Python и Jinja2 в HTML?

Я пишу приложение для выборочного списка файлов в каталоге. Я бы хотел, чтобы пользователи открывали HTML-файл и получали сообщение «Обновление...», пока Python просматривает каталог и собирает информацию. Когда python завершится, страница будет заполнена списком файлов.

Возможно ли это с Jinja2? Читая об этом, похоже, что многие люди используют его для создания HTML-файлов из Python. Я хотел бы сделать что-то немного другое, используя его для вызова Python в HTML. Или, может быть, есть другой подход, который я должен использовать? Любые советы будут оценены.


person buttonsrtoys    schedule 31.05.2013    source источник
comment
Вы не можете выполнить код Python из HTML. Чтобы делать такие вещи, вы должны запустить сервер.   -  person michaelmeyer    schedule 31.05.2013


Ответы (3)


Вы не можете выполнить Python из обработанного шаблона, но вы можете делать то, что хотите, комбинируя Python с Javascript. Я собираюсь использовать Flask в качестве примера веб-фреймворка, но должно быть довольно ясно, что он делает, даже если вы не знакомы с Flask в частности.

Идея в том, что у вас есть два маршрута/адреса. Один служит вам основным представлением, в котором вы хотите, чтобы ваше «Обновление ...» имело место. Другой маршрут возвращает фрагмент HTML, состоящий из данных каталога, преобразованных в подходящее представление HTML. Что-то вроде этого:

Питон:

def _walk_through_directories():
    """
    Walk through directories and gather the
    data you want and return it in some collection
    for example.
    """
    ...
    return directory_data


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


@app.route('/directories/fragment')
def directories():
    directory_data = _walk_through_directories()
    return render_template('directories_fragment.html',
                           directory_data=directory_data)

Теперь, когда пользователь заходит на вашу базовую страницу в /directories, он/она видит ваш базовый шаблон, который еще не содержит ничего о данных каталога. Чтобы исправить это, вы можете выполнить Javascript после загрузки документа и получить содержимое, выполнив HTTP GET с Ajax. Что-то вроде этого:

Javascript + jQuery, вызываемый из «directory.html»:

$('#message-box').html('Updating...');

$.get('/directories/fragment', function(data) {
  $('#result-box').html(data);
  $('#message-box').html('All done!');
});

Таким образом, идея состоит в том, чтобы обслуживать базовую страницу с помощью Python, а затем использовать Javascript на стороне клиента для получения «динамического» контента. Обратите внимание, что я просто собрал это вместе, так что где-то может не хватать пары скобок, и вам следует добавить правильную обработку ошибок и все такое прочее.

person Kalle    schedule 02.06.2013
comment
Трюк с возвратом render_template в виде html-фрагмента мне очень помог! Спасибо - person Gyfis; 17.08.2016

Jinja2 сам по себе является просто языком шаблонов. Для повторного заполнения части HTML данными из вашего приложения Python я бы использовал библиотеку JavaScript, такую ​​​​как jQuery, которая может извлекать данные через AJAX и изменять DOM с результатами. Например, ваша начальная страница будет отображать «Обновление…» в элементе div. jQuery делает вызов AJAX к URL-адресу вашего приложения, которое считывает каталог и отправляет строку в формате HTML (возможно, также отображаемую через Jinja) с результатами, которые заменят содержимое «обновляющего» div.

person kkoala    schedule 31.05.2013

Если вы хотите, чтобы пользователь получал обновления, вы должны использовать API канала. API канала может отправлять обновления из задачи в javascript в клиенте.

См. этот пост в блоге: http://blog.notdot.net/2011/07/Using-the-Channel-API-on-App-Engine-for-instant-traffic-analysis

person voscausa    schedule 31.05.2013