gpt4 book ai didi

javascript - Flask session 不持久( postman 工作,Javascript 不)

转载 作者:数据小太阳 更新时间:2023-10-29 06:04:40 26 4
gpt4 key购买 nike

我正在开发一个 Flask 服务器,以便通过网络在某些后端 Python 功能和 Javascript 客户端之间进行通信。我正在尝试利用 Flask 的 session 变量在用户与应用程序交互的过程中存储用户特定的数据。我已经删除了下面大部分特定于应用程序的代码,但我遇到的核心问题仍然存在。

这是我的(简化的)Flask 应用程序的代码:

import json
import os
from flask import Flask, jsonify, request, session

app = Flask(__name__)
app.secret_key = 'my_secret_key'

@app.route('/', methods=['GET'])
def run():
session['hello'] = 'world'
return jsonify(session['hello'])

@app.route('/update', methods=['POST'])
def update():
return jsonify(session['hello'])

if __name__ == '__main__':
app.run(host='0.0.0.0')

利用 Postman,我可以向我的服务器发出 GET 请求并接收 “world” 的预期输出。然后我可以使用任意主体发出 POST 请求并接收相同的 "world" 预期输出(再次使用 Postman)。

当使用 Chrome 时,我可以访问我的服务器 IP 并在页面上看到预期的输出 "world"。我还可以使用 Javascript(在 Chrome 的控制台中)手动发出 GET 请求,并收到与预期相同的响应。但是,当我尝试使用 Javascript 向服务器发送 POST 请求时出现了问题;服务器在尝试发出此请求时显示 KeyError: 'hello'

这是我用来发出 POST 请求的 Javascript:

var url = 'http://my_server_ip/update';
fetch(url, {
method: 'POST',
body: JSON.stringify('arbitrary_string'),
headers: new Headers({
'Content-Type': 'application/json'
})
})
.then(response => response.json())
.then((data) => {
console.log(data);
})

这里出了什么问题?为什么我可以使用 Postman 发出 GET/POST 请求,但使用 Javascript 发出相同的请求时会出错?

最佳答案

caveats fetch 文档部分说:

By default, fetch won't send or receive any cookies from the server, resulting in unauthenticated requests if the site relies on maintaining a user session.

推荐使用AJAX与 Flask View 交换信息。

同时,在 Flask 应用程序的代码中,session 对象是一个字典。现在,如果您使用键 session['hello'] 访问字典,并且如果该键不存在,则会引发 Keyerror。要解决此错误,您可以对字典使用 get() 方法。

发生的事情是:fetch 请求在 Flask session 中找不到 hello 键(或从 Flask View 中获取 session 值)。

user = session.get('hello')
return jsonify(session_info=user)

但这仍然会为 session { session_info: null } 提供一个 null 值。为什么?

当您向 Flask 服务器发送 GET/POST 请求时, session 会在 Flask 中初始化和查询。但是,当您发送 Javascript fetch POST 请求时,您必须首先从 Flask 获取 session 值,然后将其作为 POST 请求发送到您的 Flask View ,该 View 返回 session 信息。

在您的代码中,当从 fetch 触发 POST 请求时,当我将有效负载数据发送到 Flask 时,它被正确接收并且您使用 request.get_json()< 进行检查 在 Flask View 中:

@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没有收到session信息,因为我们没有先调用GET从Flask获取session信息。

记住:Flask session 存在于 Flask 服务器上。要通过 Javascript 发送/接收信息,您必须单独调用,除非有存储 session 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 View 会略有变化:

@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)

当您现在触发 Javacript 请求时,输出将是:{ session_info: 'world' }

关于javascript - Flask session 不持久( postman 工作,Javascript 不),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49712385/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com