关于flask_session get 为None的问题
最近新开发一个工程,前端为vue,后端是flask,调用登录接口登录成功后,设置好flask_session,再调用其他接口,session.get(‘key’)获取到的值为None,经过研究,总结如下:
问题描述:登录接口设置session后,其他接口获取到的session为None
解决方案:问题主要由cookie被阻止引起,flask_session通过cookie中的值判断是否同一会话,在跨域访问时,cookie被阻止,导致无法获取会话信息,需要关注以下几点:
1.产生跨域时,后台需要允许跨域访问,对于flask,即为如下配置:
# 全局跨域
from flask import Flask
from flask_cors import CORS
gl.app = Flask('terminal-release')
# 此处配合前台,设置supports_credentials为True,意味着允许验证信息传输
CORS(gl.app, supports_credentials=True)
# 单个接口跨域
from flask_cors import cross_origin
@cross_origin()
def get_user_file_release():
pass
2.前端需要允许验证信息传输,并设置会话区分cookie
// 在main.js中设置
import axios from "axios";
axios.defaults.withCredentials = true; // 发送凭据
axios.defaults.xsrfCookieName = 'session:'; // 以‘session:’识别会话
关于xsrfCookieName
设置,此处意味着使用cookie中key为session:
的cookie进行会话区分,这也是flask_session判断是否是同一会话的关键,此处的session:
是flask_session配置SESSION_KEY_PREFIX
的默认值
3.注意:以上方法只适用于域名相同,端口号不同的情况,域名不同时,浏览器SameSite设置会阻止cookie传输,上述方法无效:
4.域名不同时可以使用vue代理配置,此时不需要进行1,2步的配置(注意:如果你使用npm serve默认配置,即localhost:8080
访问前端,此方法目标地址不能是localhost
,可以写127.0.0.1
)
const {defineConfig} = require('@vue/cli-service')
module.exports = defineConfig({
transpileDependencies: true, devServer: {
proxy: {
'/api': {
target: 'http://ip:port',
changeOrigin: true
}
}
}
})