我正在使用Flask作为Web框架,我正在尝试实现Mike Dewar所着的 D3入门一书中的第一个示例。我有一个名为run.py
的Python脚本和两个目录templates/
和static/
,分别包含index.html
和service_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。
答案 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上的时间戳,可能只是做一个新的保存?