我正在尝试访问Flask视图中的外部网址https://data.dublinked.ie/cgi-bin/rtpi/realtimebusinformation?stopid=184&format=json
我收到了错误,
未找到
在服务器上找不到请求的URL。如果您输入了URL 请手动检查您的拼写,然后重试。
那是我的本地服务器那个烧瓶正在寻找这个网址。如果是这样,为什么?我在当地运行烧瓶。
视图,services.py
from flask import Flask, Response
import json
import urllib2
app = Flask(__name__)
@app.route('/')
def test():
return 'Everything is running!'
@app.route('/stopid')
def stopid():
dublin_bus_url = "https://data.dublinked.ie/cgi-bin/rtpi/realtimebusinformation?stopid=184&format=json"
response = urllib2.urlopen(dublin_bus_url)
json_response = json.load(response)
routes = set()
for result in json_response["results"]:
routes.add(result["route"])
return json.dumps(list(routes))
if __name__ == '__main__':
app.run()
index.html和脚本是,
<!DOCTYPE html>
<html>
<head>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
</head>
<body>
<script>
d3.json("/stopid", function(error, routes) {
routes.forEach(function(route) {
console.log(route)
});
});
</script>
</body>
</html>
我是Flask的新手,但这绝不是处理视图中外部链接的方法。
以上代码是从Donorschoose api的优秀教程中采用的。
https://github.com/VidyaSource/starting-with-data
谢谢,
答案 0 :(得分:1)
如果我们假设flask
没有提供HTML文件:
您需要启用跨源资源共享。您可以通过创建回复并将其标题Access-Control-Allow-Origin
设置为*
来实现此目的:这就是每个人。或者,您可以在部署时将其设置为您自己的域。
resp.headers['Access-Control-Allow-Origin'] = '*'
此外,您正在调用d3.json("/stopid" ...
,您需要将其更改为:
d3.json("http://localhost:5000/stopid" ...
完整代码:
from flask import Flask, Response, jsonify
import json
import urllib2
app = Flask(__name__)
@app.route('/')
def test():
return 'Everything is running!'
@app.route('/stopid')
def stopid():
dublin_bus_url = "https://data.dublinked.ie/cgi-bin/rtpi/realtimebusinformation?stopid=184&format=json"
my_response = urllib2.urlopen(dublin_bus_url)
json_response = json.load(my_response)
routes = set()
for result in json_response["results"]:
routes.add(result["route"])
resp = jsonify(list(routes))
resp.headers['Access-Control-Allow-Origin'] = '*'
return resp
if __name__ == '__main__':
app.run()
如果HTML正由烧瓶提供,则无需启用跨源共享。
@app.route('/d3')
def d3():
return render_template('d3.html')
使用以下方法调用此网址的链接:
d3.json("{{ url_for('stopid') }}", ...
但这并不完全可靠,因为当你可以在烧瓶本身中使用时,你不想使用api。