Я пытаюсь получить доступ к внешнему 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://github.com/VidyaSource/starting-with-data
Благодарность,
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, когда вы можете сделать это в самой колбе.
Похожие вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.
render_template('d3.html')
?