D3从Python函数中获取数据

时间:2015-05-22 22:43:11

标签: javascript python json d3.js flask

我有一个名为/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函数来请求数据。

为什么这对我不起作用?

1 个答案:

答案 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

link