【问题标题】:Difficulty accessing json file with d3 and flask难以使用 d3 和烧瓶访问 json 文件
【发布时间】:2013-03-07 01:55:53
【问题描述】:

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

【问题讨论】:

    标签: python json d3.js flask


    【解决方案1】:

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

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

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

    【讨论】:

    • 我把 url_for(..) 行放在 app 声明之后,我得到以下错误:"Attempted to generate一个带有正在推送的应用程序上下文的 URL。这必须执行。" 我需要对 app.test_request_context() 做些什么吗?还是我错过了其他非常明显的东西? (我上周刚拿起了烧瓶和网络相关的东西。)
    • 抱歉,我应该更具体一些。 url_for(... 应该在 app.run() 之后,在 if __name__ == '__main__' 条件内
    • 我在app.run() 之后移动了url_for(..) 行。我仍然收到应用程序上下文错误,但不再收到 404 错误。
    • 非常感谢您的帮助。我发现我的错误,我使用了selectall()而不是selectAll(),但是将json文件放在static/目录中也是我完全错过的重要事情。
    【解决方案2】:

    像您的 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 对象构造器来更改它

    【讨论】:

    • 我在静态目录下有json文件,我把url_for(..)调用放到了模板里,但是数据还是没有渲染出来。我收到这些消息: ..."GET / HTTP/1.1" 200 - ..."GET /favicon.ico HTTP/1.1" 404 - ..."GET / HTTP/1.1" 200 - ..."GET /static/service_status.json HTTP/1.1" 304 - ..."GET /favicon.ico HTTP/1.1" 404 -
    【解决方案3】:

    您似乎收到了 304 状态代码,正如您在之前的 cmets 中提到的那样。我看到您的 JSON 具有以下日期/时间:

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

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

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

    基本上是这样说的

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

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

    【讨论】:

    • 我不确定。我今天早上创建了 json 文件。此外,通过执行@DazWorrall 的建议,304 状态代码已(神奇地)清除。
    • 好的。我以为您回复了@DazWorrall,您仍然收到“...”GET /static/service_status.json HTTP/1.1“304”。如果没有,那么 np.
    • 抱歉,我在发布后不久更新了我的问题陈述,但现在一些 cmets 已经过时了。
    猜你喜欢
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 2020-11-04
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 2022-01-09
    相关资源
    最近更新 更多