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

时间:2013-03-18 16:20:26

标签: python json d3.js flask

我正在使用Flask作为Web框架,我正在尝试实现Mike Dewar所着的 D3入门一书中的第一个示例。我有一个名为run.py的Python脚本和两个目录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 )

这就是我在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>

我使用的是Windows 7,Google Chrome和Python 2.7。

3 个答案:

答案 0 :(得分:6)

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

from flask import url_for
url_for('static', filename='service_status.json')

要使其工作,还要将JavaScript中的路径更改为'/static/service_status.json'

答案 1 :(得分:3)

默认情况下,json文档之类的静态文件是从模板的其他目录提供的 - by default 'static'

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

d3.json("{{ url_for('static', filename='service_status.json') }}",draw);

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

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

答案 2 :(得分:0)

您似乎正在获得304状态代码,正如您在之前的评论中所提到的那样。我看到你的JSON有以下日期/时间:

"Date": [
    "12/15/2011"
], 
"Time": [
    " 7:35AM"
], 

我不是百分百肯定,但这可能有所帮助:

http://www.w3.org/Protocols/HTTP/HTRQ_Headers.html#if-modified-since

基本上,它说

“此请求标头与GET方法一起使用以使其成为条件:如果请求的文档自此字段中指定的时间以来未更改,则不会发送文档,而是发送未修改的304回复。 此字段的格式与日期相同:“

那么,你可以查看JSON上的时间戳,可能只是做一个新的保存?