我有一个名为/CastCrew
的Python函数,它填充表单并返回所选的.json文件名。
这个选择的json文件用于创建d3图形但是当我在选择文件后按“提交”时,我得到一个消息框“打开CastCrew”(当我打开它时,我看到我选择的json文件),它打开了文件,D3没有读取该文件。
这是Flask中的@ app.route,
@app.route('/CastCrew', methods=['GET', 'POST'])
def crew():
form = CrewForm()
if form.validate_on_submit():
return current_app.send_static_file(os.path.join('Crews/', form.filename.data))
return render_template('Crew.html', form=form)
对于D3,我想调用这样的文件 -
d3.json("/CastCrew", function(error, graph) {
force
.nodes(graph.nodes)
.links(graph.links)
.start();
我也尝试过url_for,但它没有任何区别
d3.json("{{ url_for('CastCrew') }}", function(error, graph) {
在this tutorial中,通过在d3中调用Python函数来请求数据。
为什么这对我不起作用?
答案 0 :(得分:3)
您需要使用JavaScript发布表单。如果您没有覆盖提交事件,浏览器只会在您单击按钮时提交正常请求,该按钮将返回该文件。
此外,d3.json(url).post(data, callback)
发出GET请求,但视图从POST请求发送json文件。请使用$('form').submit(function(event) {
event.preventDefault();
d3.json("{{ url_for('crew') }}")
.header('Content-Type', 'application/x-www-form-urlencoded')
.post($(this).serialize(), function(error, graph) {
# show your graph
});
});
发送帖子。您还需要发送表单数据。
以下是使用JQuery进行此操作的示例。
$('form').submit(function(event) {
event.preventDefault();
$.post("{{ url_for('crew') }}", $(this).serializeArray(), function(graph) {
# show your graph
});
});
如果您仍然愿意使用JQuery,您也可以使用它来发布帖子请求而不是使用D3,因为它更直接。
> x<-c(10, 12, 75, 89, 25, 100, 67, 89, 4, 67, 120.2, 140.5, 170.5, 78.1)
> x <- data.frame(x)
> within(x, Q <- as.integer(cut(x, quantile(x, probs=0:5/5, na.rm=TRUE),
include.lowest=TRUE)))
x Q
1 10.0 1
2 12.0 1
3 75.0 3
4 89.0 4
5 25.0 2
6 100.0 4
7 67.0 2
8 89.0 4
9 4.0 1
10 67.0 2
11 120.2 5
12 140.5 5
13 170.5 5
14 78.1 3