Я пытаюсь получить доступ к внешнему URL-адресу https: //data.dublinked .ie / cgi-bin / rtpi / realtimebusinformation? stopid = 184 & format = json в представлении Flask.

Я получаю ошибку,

не обнаружена

Запрошенный URL-адрес не найден на сервере. Если вы ввели 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, но это не должно быть способом работы с внешней ссылкой в ​​представлении.

Приведенный выше код взят из этого отличного руководства по API Donorschoose.

https://youtu.be/bzl4hCH2CdY

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

Благодарность,

0
Shane G 25 Июн 2016 в 20:30

1 ответ

Лучший ответ

Если предположить, что файл HTML не обслуживается flask:

Вам необходимо включить совместное использование ресурсов Cross origin. Вы можете сделать это, создав ответ и установив его заголовок 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')

Вызовите ссылку на этот URL, используя:

d3.json("{{ url_for('stopid') }}", ...

Но это не совсем надежно, потому что вы не хотите использовать api с помощью javascript, когда вы можете сделать это в самой колбе.

1
oxalorg 25 Июн 2016 в 21:33
Хорошо, спасибо за ответ. Мне нужно немного сделать, чтобы ваше предложение сработало. Спасибо за ответ.
 – 
Shane G
25 Июн 2016 в 21:14
Я считаю правильным сказать, что файл html обслуживается Flask.
 – 
Shane G
25 Июн 2016 в 21:25
1
Так ты делаешь render_template('d3.html')?
 – 
oxalorg
25 Июн 2016 в 21:30
1
Проверьте мой обновленный ответ, если вы обслуживаете html с помощью фляги.
 – 
oxalorg
25 Июн 2016 в 21:34
Ваш последний ответ работает. Странно, но то, что я делал изначально, работает в учебнике, но не тогда, когда я пытаюсь применить его к этому другому API. Спасибо за вашу помощь.
 – 
Shane G
25 Июн 2016 в 22:42