The caveats https://github.com/github/fetch#caveats的部分fetch
文档说:
默认情况下,fetch 不会从服务器发送或接收任何 cookie,如果站点依赖于维护用户会话,则会导致未经身份验证的请求。
推荐使用AJAX http://flask.pocoo.org/docs/0.12/patterns/jquery/与 Flask 视图交换信息。
同时,在 Flask 应用程序的代码中,session
对象是一本字典。现在,如果您使用字典的键访问字典session['hello']
如果该键不存在,则Keyerror
被提出。要解决此错误,您可以使用get()
字典的方法。
正在发生的事情是:fetch
请求未找到hello
Flask 会话中的 key(或从 Flask 视图获取会话值)。
user = session.get('hello')
return jsonify(session_info=user)
但这仍然会给你一个null
会话的价值{ session_info: null }
。为什么会这样?
当您向 Flask 服务器发送 GET/POST 请求时,会在 Flask 中初始化并查询会话。但是,当您发送 Javascriptfetch
POST 请求,您必须首先从 Flask 获取会话值,然后将其作为 POST 请求发送到 Flask 视图,其中return
是会话信息。
在您的代码中,当 POST 请求被触发时fetch
,当我将有效负载数据发送到 Flask 时,它被正确接收,您可以使用request.get_json()
在烧瓶视图中:
@app.route('/update', methods=['POST'])
def update():
user = session.get('hello')
payload = request.get_json()
return jsonify(session_info=user, payload=payload)
这将返回{ payload: 'arbitrary_string', session_info: null }
。这也表明fetch
没有收到会话信息,因为我们没有先调用 GET 从 Flask 获取会话信息。
Remember:Flask 会话位于 Flask 服务器上。要通过 Javascript 发送/接收信息,您必须进行单独的调用,除非有存储会话 cookie 的规定。
const fetch = require('node-fetch');
var url_get = 'http://my_server_ip';
var url_post = 'http://my_server_ip/update';
fetch(url_get, {
method:'GET'
}).then((response)=>response.json()).then((data) =>fetch(url_post, {
method: 'POST',
body: JSON.stringify(data),
dataType:'json',
headers: {
'Content-Type': 'application/json'
}
})
.then(response => response.json())
.then((postdata) => {
console.log(postdata);
}));
Flask 视图会略有变化:
@app.route('/', methods=['GET'])
def set_session():
session['hello'] = 'world'
return jsonify(session['hello'])
@app.route('/update', methods=['POST'])
def update():
payload = request.get_json()
return jsonify(session_info=payload)
当您现在触发 Javascript 请求时,输出将是:{ session_info: 'world' }