难以使用d3和flask访问json文件

cjo*_*318 6 python json flask d3.js

我正在使用Flask作为Web框架,我正在尝试实现Mike Dewar的D3入门一书中的第一个示例.我有一个名为Python脚本run.py和两个目录,templates/static/包含index.htmlservice_status.json分别.不幸的是,我的代码根本没有渲染数据,也没有产生任何明显的错误.

这就是我所拥有的run.py:

#!/usr/bin/env python

from flask import Flask, render_template, url_for
app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

if __name__=="__main__":
    port = 5000
    app.debug = True
    app.run( port=port )
Run Code Online (Sandbox Code Playgroud)

这就是我所拥有的templates/index.html:

<!DOCTYPE HTML>
<HTML>

<HEAD>
  <META CHARSET="utf-8">
  <SCRIPT SRC="http://d3js.org/d3.v3.min.js"></SCRIPT>
  <SCRIPT>
    function draw(data) {
        "use strict";
        d3.select("body")
        .append("ul")
        .selectAll("li")
        .data(data)
        .enter()
        .append("li")
        .text( function(d){
            return d.name + ": " + d.status;
            }
        );
    }
  </SCRIPT>
  <TITLE>MTA Data</TITLE>
</HEAD>

<BODY>
  <H1>MTA Availability Data</H1>
  <SCRIPT>
    d3.json("{{ url_for( 'static', filename='service_status.json') }}",draw); // <---- BIG PROBLEM
  </SCRIPT>
</BODY>

</HTML>
Run Code Online (Sandbox Code Playgroud)

我使用的是Windows 7,谷歌浏览器和Python 2.7.

Ada*_*eng 6

如果JSON文件不会更改,那么您应该将它放在static目录中并使用

from flask import url_for
url_for('static', filename='service_status.json')
Run Code Online (Sandbox Code Playgroud)

为此,还要将JavaScript中的路径更改为 '/static/service_status.json'


Daz*_*all 5

默认情况下,像 json 文档这样的静态文件是从与模板不同的目录提供的 -默认情况下为“static”

您不需要在视图中使用 url_for 调用,您可以在模板中使用它:

d3.json("{{ url_for('static', filename='service_status.json') }}",draw);
Run Code Online (Sandbox Code Playgroud)

总结一下:1) 将 json 文档移至静态文件夹(默认情况下,模板文件夹旁边名为 static 的文件夹),2) 在模板中使用 url_for 调用来获取 json 文档的正确 URI。

如果您想使用静态以外的文件夹,可以通过传递static_folder给 Flask 对象构造函数来更改它