访问Flask视图中的网址

时间:2016-06-25 17:30:18

标签: python api flask

我正在尝试访问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://youtu.be/bzl4hCH2CdY

https://github.com/VidyaSource/starting-with-data

谢谢,

1 个答案:

答案 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。