2013-03-18 21 views
6

Tôi đang sử dụng Flask làm khuôn khổ web và tôi đang cố triển khai ví dụ đầu tiên từ sách Bắt đầu với D3, bởi Mike Dewar. Tôi có một tập lệnh Python có tên là run.py và hai thư mục, templates/static/, có chứa tương ứng là index.htmlservice_status.json. Thật không may, mã của tôi không hiển thị dữ liệu, cũng không phải là nó tạo ra bất kỳ lỗi nào rõ ràng.Khó truy cập tệp json với d3 và bình

Đây là những gì tôi có trong 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) 

Đây là những gì tôi có trong 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> 

Tôi đang sử dụng Windows 7, Google Chrome, và Python 2.7.

Trả lời

6

Nếu tệp JSON sẽ không thay đổi, sau đó bạn nên đặt nó trong thư mục static và sử dụng

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

Để làm việc này, cũng thay đổi đường dẫn trong hoạt Javascript để '/static/service_status.json'

+0

Tôi đặt dòng * url_for (..) * sau khai báo * ứng dụng * và tôi nhận được lỗi sau: ** "Đã cố gắng tạo URL có ngữ cảnh ứng dụng đang được đẩy. Điều này phải được thực hiện". ** Tôi có cần phải làm gì đó với * app.test_request_context() * không? Hay tôi thiếu cái gì khác mà thực sự rõ ràng?(Tôi vừa nhặt bình và những thứ liên quan đến trang web nói chung vào tuần trước.) – cjohnson318

+0

Xin lỗi, tôi cần phải cụ thể hơn. 'url_for (...' phải sau 'app.run()', bên trong 'if __name__ == '__main __'' có điều kiện –

+0

Tôi đã di chuyển dòng 'url_for (..)' sau 'app.run()' Tôi vẫn nhận được lỗi bối cảnh ứng dụng, nhưng tôi không nhận được lỗi 404 nữa. – cjohnson318

3

Các tệp tĩnh như tài liệu json của bạn, theo mặc định được phân phát từ một thư mục khác từ các mẫu - by default 'static'

Bạn không cần sử dụng lệnh gọi url_for trong chế độ xem của mình, bạn có thể sử dụng nó trong templ ăn:

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

Vì vậy, để tóm tắt: 1) Di chuyển tài liệu json của bạn vào thư mục tĩnh (một thư mục có tên tĩnh dọc phía thư mục mẫu của bạn, theo mặc định), và 2) sử dụng các cuộc gọi url_for trong mẫu của bạn để lấy URI chính xác cho tài liệu json của bạn.

Nếu bạn muốn sử dụng một thư mục khác ngoài tĩnh, bạn có thể thay đổi điều đó bằng cách thông qua static_folder đến đối tượng contructor Flask

+0

Tôi có tệp json trong thư mục tĩnh và tôi đặt lệnh gọi 'url_for (..)' trong mẫu, nhưng các dữ liệu vẫn chưa được trả lại tôi nhận được những tin nhắn này: ... "GET/HTTP/1.1" 200 - ... "GET /favicon.ico HTTP/1.1" 404 - ...". GET/HTTP/1.1 "200 - ..." GET /static/service_status.j con trai HTTP/1.1 "304 - ..." GET /favicon.ico HTTP/1.1 "404 - – cjohnson318

0

Bạn dường như nhận được một mã số 304 tình trạng như bạn nêu trong ý kiến ​​trước đó. Tôi thấy rằng JSON của bạn có ngày sau/thời gian:

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

Tôi không chắc chắn 100% nhưng điều này có thể giúp:

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

Về cơ bản, nó nói rằng

"Đây tiêu đề yêu cầu được sử dụng với phương thức GET để làm cho nó có điều kiện: nếu tài liệu được yêu cầu không thay đổi kể từ thời gian được chỉ định trong trường này, tài liệu sẽ không được gửi, mà thay vào đó là trả lời 304 không được sửa đổi. giống như ngày tháng: "

Vì vậy, có thể bạn có thể kiểm tra dấu thời gian trên JSON và có thể chỉ cần lưu mới?

+0

Tôi không chắc chắn. Tôi đã tạo tập tin json sáng nay. Ngoài ra, mã trạng thái 304 đã được (kỳ diệu) được xóa bỏ bằng cách thực hiện lời khuyên của @DazWorrall. – cjohnson318

+0

ok. Tôi nghĩ rằng bạn đã trả lời @DazWorrall rằng bạn vẫn nhận được "..." GET /static/service_status.json HTTP/1.1 "304". Nếu không, thì np. – codegeek

+0

Xin lỗi, tôi đã cập nhật báo cáo sự cố của mình một thời gian sau khi tôi đăng nó, nhưng bây giờ một số ý kiến ​​đã được ghi ngày. – cjohnson318

Các vấn đề liên quan