JS 请求的主体未出现在 Flask 中
Body of JS Request not Appearing in Flask
我正在尝试从 JS 脚本向 pythonanywhere 上的 Flask 服务器发出 POST 请求,如下所示:
const response = await fetch('http://myusername.pythonanywhere.com/', {
method: 'POST',
mode: 'no-cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
track: track
})
});
其中 track 是一个 nx10 数组。我已经成功地通过 Insomnia 向服务器发出了如下请求:
{
"track": [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10.234], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]
}
并将请求的正文内容打印到日志中,如下所示:
2021-11-16 15:57:14 Test message!
2021-11-16 15:57:14 <Request 'http://myusername.pythonanywhere.com/' [POST]>
2021-11-16 15:57:14 {'track': [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10.234], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]}
但是,当我尝试使用第一段代码从我的 Web 应用程序发出请求时,我在日志中得到了这个:
2021-11-16 15:54:21 Test message!
2021-11-16 15:54:21 <Request 'http://myusername.pythonanywhere.com/' [POST]>
2021-11-16 15:54:21 None
服务器代码:
@app.route('/', methods=['POST'])
def handle_post():
req_data = request.get_json()
print("Test message!")
print(request)
print(req_data)
data = req_data['track']
trackData = np.array(data)
grade = analysisV2(trackData)
return jsonify({"grade": grade})
我不知道为什么一个请求有效而另一个请求无效。我也尝试过将我在 Insomnia 中使用的相同数据硬编码到 JS 请求正文中,没有任何区别。有人看到我可能遗漏的东西吗?
我设法弄清楚发生了什么,以防有人想知道并且恰好在做类似的事情。
这里有几个问题:
- 向请求添加
mode: 'no-cors'
会阻止服务器响应任何实际数据,因此必须将其删除。
- Flask 中的 get_json() 方法在这种情况下由于某种原因无法正常工作,所以我只是使用了 json.loads(request.get_data()) 方法。在响应中,还使用了 json.dumps() 方法,而不是 .jsonify()。
- 客户端必须发送带有
'Access-Control-Allow-Origin': '*'
header 的请求。
- 服务器还需要使用
from flask_cors import CORS
和 CORS(app)
启用 CORS
我正在尝试从 JS 脚本向 pythonanywhere 上的 Flask 服务器发出 POST 请求,如下所示:
const response = await fetch('http://myusername.pythonanywhere.com/', {
method: 'POST',
mode: 'no-cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
track: track
})
});
其中 track 是一个 nx10 数组。我已经成功地通过 Insomnia 向服务器发出了如下请求:
{
"track": [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10.234], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]
}
并将请求的正文内容打印到日志中,如下所示:
2021-11-16 15:57:14 Test message!
2021-11-16 15:57:14 <Request 'http://myusername.pythonanywhere.com/' [POST]>
2021-11-16 15:57:14 {'track': [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10.234], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]}
但是,当我尝试使用第一段代码从我的 Web 应用程序发出请求时,我在日志中得到了这个:
2021-11-16 15:54:21 Test message!
2021-11-16 15:54:21 <Request 'http://myusername.pythonanywhere.com/' [POST]>
2021-11-16 15:54:21 None
服务器代码:
@app.route('/', methods=['POST'])
def handle_post():
req_data = request.get_json()
print("Test message!")
print(request)
print(req_data)
data = req_data['track']
trackData = np.array(data)
grade = analysisV2(trackData)
return jsonify({"grade": grade})
我不知道为什么一个请求有效而另一个请求无效。我也尝试过将我在 Insomnia 中使用的相同数据硬编码到 JS 请求正文中,没有任何区别。有人看到我可能遗漏的东西吗?
我设法弄清楚发生了什么,以防有人想知道并且恰好在做类似的事情。
这里有几个问题:
- 向请求添加
mode: 'no-cors'
会阻止服务器响应任何实际数据,因此必须将其删除。 - Flask 中的 get_json() 方法在这种情况下由于某种原因无法正常工作,所以我只是使用了 json.loads(request.get_data()) 方法。在响应中,还使用了 json.dumps() 方法,而不是 .jsonify()。
- 客户端必须发送带有
'Access-Control-Allow-Origin': '*'
header 的请求。 - 服务器还需要使用
from flask_cors import CORS
和CORS(app)
启用 CORS