reactjs - Flask 会话不保留 api 请求之间的数据
问题描述
我真的很难让会话为我的 React/Flask/Postgres 应用程序正常工作。在下面的代码片段中,user_id 存储在登录路由的 session 中。它被正确存储并在以下打印语句中打印会话 user_id。这不会在调用甚至函数之间保留
在 login 中调用 loadUser() 时,无法找到 session 中存储的 user_id。
app = Flask(__name__)
SESSION_TYPE = "filesystem"
SECRET_KEY = os.getenv("SECRET_KEY")
app.config.from_object(__name__)
app.config['ENV'] = "development"
app.config['SESSION_COOKIE_SECURE'] = True
app.config['SESSION_COOKIE_SAMESITE'] = 'None'
Session(app)
# Set up some configurations for the app
cors = CORS(app, support_credentials=True, resources={
r"/*": {
"origins": "*"
}
})
con = psycopg2.connect(
dbname=DATABASE,
user=DATABASE_USER,
password=DATABASE_PASS,
host="146.69.161.48",
port="5432"
)
con.autocommit = True
cur = con.cursor()
@app.route("/api/login", methods=['POST'])
@cross_origin(supports_credentials=True)
def login():
data = request.get_json()
username = data['username']
password = data['password']
error = None
cur.execute(
sql.SQL(
"SELECT * FROM UserInfo WHERE username = (%s);"),
[username])
user = cur.fetchone()
if user is None:
error = 'Incorrect username.'
elif not check_password_hash(user[2], password):
error = 'Incorrect password.'
if error is None:
session['user_id'] = user[0]
loadUser()
response = make_response(jsonify("User: " + str(session['user_id']) + " logged in."))
response.headers.add('Access-Control-Allow-Headers',
"Origin, X-Requested-With, Content-Type, Accept, x-auth")
return response
登录后从 React 请求会话本身时,会话只返回一个“_permanent”=true 的对象。这至少表明它正在成功返回会话对象。
@app.route("/api/getSession", methods=['GET'])
@cross_origin(supports_credentials=True)
def getSession():
response = make_response(jsonify(session))
response.headers.add('Access-Control-Allow-Headers',
"Origin, X-Requested-With, Content-Type, Accept, x-auth")
return response
我可以在 Postman 中看到存储的会话 cookie,但无法看到存储在 Chrome/Firefox 中的任何会话 cookie。
反应请求:
const handleSubmit = event => {
event.preventDefault();
console.log(email);
console.log(password);
let data = {"username": email, "password": password}
axios
.post("http://146.69.161.48:5000/api/login", data, {withCredentials: true})
.then((response) => {
console.log(response);
})
.catch((error) => {
console.error("There was an error logging in", error);
});
};
const getSession = event => {
axios
.get("http://146.69.161.48:5000/api/getSession", {withCredentials: true})
.then((response) => {
console.log(response);
})
.catch((error) => {
console.error("There was an error. ", error);
});
};
解决方案
推荐阅读
- spring - Grails 应用程序:如何为 tomcat 设置显示名称?
- java-8 - Mockito 无法模拟此类:接口
- swift - Swift class does not conform to Protocol with Enum
- javascript - 如何直接在圈内写东西?
- macos - 如何检查 QLPreview 是否已加载?
- laravel-5 - 我如何加入两个查询然后分页
- python - 加速光流算法(如果适用) Python OpenCV
- java - 使用 MySql 的 Spring Boot 反应式(Webflux)
- android - 如果我重新打开我的 google play dev 帐户,我的应用程序会恢复吗?
- python - 使用 pandas dataframe.query 查找相同的行