6

我正在使用 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 )

这就是我所拥有的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。

4

3 回答 3

6

如果 JSON 文件不会更改,则应将其放在static目录中并使用

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

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

于 2013-03-18T16:25:29.013 回答
5

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

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

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

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

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

于 2013-03-18T17:09:44.187 回答
0

正如您在前面的评论中提到的,您似乎得到了 304 状态代码。我看到您的 JSON 具有以下日期/时间:

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

我不是 100% 确定,但这可能会有所帮助:

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

基本上,它说

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

那么,您是否可以检查 JSON 上的时间戳并可能只是重新保存?

于 2013-03-18T18:24:14.450 回答