首页 > 解决方案 > 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);
    });
  };

标签: reactjsflasksessionsession-cookies

解决方案


推荐阅读