python - 在 AJAX 请求中包含 Bottle 模板

标签 python jquery ajax python-3.x bottle

这是我的场景。我正在尝试制作一个本地网络应用程序来操作我的电影文件,既可以作为节省时间的工具,也可以作为 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() 会返回 template('file_list')。 ajax.success() 中没有 python,它只会用收到的任何 HTML 更新页面。正如预期的那样工作;我输入了一条路径,点击提交,就会出现所需的表格。但是,我认为服务器只提供 JSON 数据并让客户端将其插入到适当的模板文件中是更好的做法。

我这样想是因为如果列表不是电影,而是电视节目或音乐怎么办?我可能想使用不同的模板,不想为不同的媒体制作新的路线。

我觉得我收到此错误是因为在 ajax.success() 可以定义结果变量之前呈现模板。

关于如何使这项工作有任何想法吗?

最佳答案

语法 <% %>实际上在 Bottle 里不起作用。始终使用 % 和 %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 更容易,而且他们可以根据需要进行过滤。

关于python - 在 AJAX 请求中包含 Bottle 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52106903/

相关文章:

python - 迁移到 GAE

javascript - 在松散类型语言的单元测试中,是否应该检查方法的返回类型?

javascript - 在容器外使用 Owl Carousel 显示多个图像

javascript - jQuery Slider - 在 HTML 而不是 Javascript 中更改延迟时间

php - 如何在不使用任何库的情况下在 php 中创建 JSON Rest Web 服务?

php - 使用 AJAX 会增加 PHP 的内存使用吗?

javascript - 如何解决 Access-Control-Allow-Origin 错误?

python - 在 Mac OS X Mountain Lion 上安装 gmpy

python - 如何在 pandas 中创建与多个列组合的数据框列

javascript - 任何可用于自动同步 .js 文件的工具