在 AJAX 请求中包含瓶子模板
Including a bottle template in an AJAX request
这是我的场景。我正在尝试制作一个本地网络应用程序来处理我的电影文件,既可以作为节省时间的工具,也可以作为 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() return是一个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() 会 return 模板 ('file_list')。 ajax.success() 中没有 python,它只会用收到的 HTML 更新页面。正如预期的那样工作;我输入了一条路径,点击提交,然后就会出现所需的 table。但是,我认为服务器只提供 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 来过滤 table,一旦他们在输入字段上单击回车。但是,您可能会发现使用 datatables.net 更容易,他们可以根据需要进行过滤。
这是我的场景。我正在尝试制作一个本地网络应用程序来处理我的电影文件,既可以作为节省时间的工具,也可以作为 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() return是一个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() 会 return 模板 ('file_list')。 ajax.success() 中没有 python,它只会用收到的 HTML 更新页面。正如预期的那样工作;我输入了一条路径,点击提交,然后就会出现所需的 table。但是,我认为服务器只提供 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 来过滤 table,一旦他们在输入字段上单击回车。但是,您可能会发现使用 datatables.net 更容易,他们可以根据需要进行过滤。