Включение шаблона бутылки в запрос AJAX - PullRequest
0 голосов
/ 31 августа 2018

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

Вот мой серверный скрипт:

from bottle import run, request, post, get, template, error, static_file
from pathlib import Path
import re


# Show a list of files ready to be moved
@get('/move_new_movies')
def move_new_movies():
    return template('move_new_movies')


#  Generate a list of files for move_new_movies page
@post('/generate_movie_list')
def generate_movie_list():
    ... do some stuff ...
    return movie_list


if __name__ == '__main__':
    run(debug=True, reloader=True)

generate_movie_list () возвращает массив JSON в виде

{
    'total_results': ,
    'results': [{'folder': ,
                 'file_name':
                 }]
}

move_new_movies.tpl:

<!DOCTYPE html>
<html>
<head>
    <title>Move New Movies</title>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
    <script type="text/javascript">
        $(document).ready(function() {
            $('form').submit(function(e) {
                $.ajax({
                    type: 'POST',
                    url: '/generate_movie_list', 
                    data: $(this).serialize(), 
                    success: function(response) {
-----error------->      <%  movie_list = response['results']
                            movie_list_html = include('file_list', list='movie_list')
                            %>
                        $('#movie_list').html(movie_list_html);
                    }
                });
                e.preventDefault();
            });
        });
    </script>
</head>
<body>
    <h3>Enter path to new movies</h3>
    <form action="/move_new_movies" method="POST">
        <input type="text" name="movie_path">
        <input type="submit" name="Submit">
    </form>
    <div id='movie_list'></div>
</body>
</html>

И, наконец, file_list.tpl

<table>
    <tr>
        <th>Folder</th>
        <th>File Name</th>
    </tr>
    % for movie in list:
    <tr>
        <td>{{movie['folder']}}</td>
        <td>{{movie['file_name']}}</td>
    </tr>
    % end
</table>

Теперь вот моя проблема. Когда я просматриваю ... / move_new_movies, я получаю сообщение об ошибке

Traceback (most recent call last):
  ... ... ...
  File "\path\to\move_new_movies.tpl", line 15, in <module>
    <%  movie_list = response['results']
NameError: name 'response' is not defined

Первоначально generate_movie_list () возвращал шаблон ('file_list'). В ajax.success () не было python, и он просто обновлял страницу, используя любой полученный HTML. Это сработало так, как и ожидалось; Я ввел путь, нажал «Отправить», и появится нужная таблица. Тем не менее, я подумал, что для сервера будет лучше обслуживать только данные JSON, а клиент вставлять их в соответствующий файл шаблона.

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

Мне кажется, что я получаю эту ошибку, потому что шаблон обрабатывается раньше, чем ajax.success () может определить переменную результатов.

Есть идеи, как заставить это работать?

1 Ответ

0 голосов
/ 31 августа 2018

Синтаксис <% %> на самом деле не работает в бутылке. Всегда используйте% и% end для инкапсуляции кода. Убедитесь, что% является первым непробельным символом строки.

Я сам столкнулся с этим и никогда не получал вышеуказанный синтаксис. Это не было проблемой с тех пор.

ОБНОВЛЕНИЕ с ПРИМЕРОМ:

from bottle import run, request, post, get, template, error, static_file
from pathlib import Path
import re


# Show a list of files ready to be moved
@get('/move_new_movies')
def move_new_movies():
    movies = generate_movie_list()
    return template('move_new_movies', movies = movies)


#  Generate a list of files for move_new_movies page
def generate_movie_list():
    ... do some stuff ...
    return movie_list


if __name__ == '__main__':
    run(debug=True, reloader=True)

А твой шаблон:

</head>
<body>
    <h3>Enter path to new movies</h3>
    <input type="text" name="movie_path">
<table>
    <tr>
        <th>Folder</th>
        <th>File Name</th>
    </tr>
    % for movie in movies:
    <tr>
        <td>{{movie['folder']}}</td>
        <td>{{movie['file_name']}}</td>
    </tr>
    % end
</table>
</body>
</html>

Теперь вам понадобится ваш javascript, чтобы просто отфильтровать таблицу, когда они нажмут ввод в поле ввода. Однако вам может быть проще использовать datatables.net, и они могут фильтровать все, что захотят.

...