为啥从 Vue.js 应用程序获取时浏览器不显示 JSON 数据
Posted
技术标签:
【中文标题】为啥从 Vue.js 应用程序获取时浏览器不显示 JSON 数据【英文标题】:Why aren't browsers displaying JSON data when fetched from Vue.js app为什么从 Vue.js 应用程序获取时浏览器不显示 JSON 数据 【发布时间】:2019-06-12 02:53:48 【问题描述】:我正在尝试从我在 Flask 中实现的 Python RESTfull API 获取数据,并设置了以下代码。
tasks =
'1' : 'Learn',
'2' : 'Build',
'3' : 'Apply',
'4' : 'Succeed'
@app.route('/alltasks')
def get_tasks():
return jsonify(tasks)
当我在 url 栏中输入原始 URL 作为 http://127.0.0.1:5000/alltasks
并显示 JSON 数据时,路由工作得很好
"1": "Learn",
"2": "Build",
"3": "Apply",
"4": "Succeed"
问题是我正在尝试从我的 Vue.js 应用程序访问数据,但 Chrome 和其他浏览器不断给我这个错误:
跨域读取阻塞 (CORB) 阻止了 MIME 类型为 application/json 的跨域响应 http://127.0.0.1:5000/alltasks。有关详细信息,请参阅https://www.chromestatus.com/feature/5629709824032768。
我确认 API 正在做它应该做的事情,因为我创建了一个只返回一条消息的虚拟路由:
@app.route('/hi')
def say_hello():
return 'Thank you for checking out my API'
Vue 很好地接受了它,并显示在 Chrome 的网络诊断工具中。这是使用 Axios 的代码:
created: function()
this.loadAllTasks();
,
methods:
loadAllTasks: function ()
alert('At it');
axios.get('http://127.0.0.1:5000/alltasks')
.then(function(res, req)
alert(res);
);
警告函数没有被执行,因为一个错误被抛出。
现在我知道有人问过this question,大多数答案是运行 Chrome 并禁用网络安全,但你真的认为每个用户都会这样做吗?
是什么导致了错误,我可以使用哪些库或修改代码来修复它?
【问题讨论】:
您的 vue.js 网络应用在哪个端口上运行?如果它在与您的 API 不同的端口上运行(通常 vue 模板在端口 8080 上运行),则请求将被阻止,因为它被视为不同的来源(即127.0.0.1:8080 --> 127.0.0.1:5000)。为了解决这个问题,您可以使用 flask-cors 库并定义允许访问您的 api 的来源列表。我以前从未使用过它,所以我无法提供具体信息。文档在这里(简单用法部分应该为您提供所需的内容):flask-cors.readthedocs.io/en/latest @Joseph 是的,Vue 应用程序默认使用端口 8080。我会检查 flask-cors 看看它是否有帮助。 @Joseph 谢谢!成功了! 没问题!我会将该评论移至答案中,以便将其标记为已解决。 【参考方案1】:您的 vue.js 网络应用在哪个端口上运行?如果它在与您的 API 不同的端口上运行(通常 vue 模板在端口 8080 上运行),则请求将被阻止,因为它被视为不同的来源(即 127.0.0.1:8080 --> 127.0.0.1:5000)。为了解决这个问题,您可以使用 flask-cors 库并定义允许访问您的 api 的来源列表。我以前从未使用过它,所以我无法提供具体信息。文档在这里(简单用法部分应该为您提供所需的内容):
https://flask-cors.readthedocs.io/en/latest/
特别是,您只需将其添加到代码的顶部(在定义应用程序之后):
cors = CORS(app, resources=r"/*": "origins": "*")
【讨论】:
以上是关于为啥从 Vue.js 应用程序获取时浏览器不显示 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的页面可以获取 Vue.js 2 数据属性但它不是响应式的?
当 API 返回空数据时显示警告(Vue.js / Axios)