(sqlite, Flask + React), flask session session.get() returns



我在这个问题上花了太多时间,我认为我只是做错了什么,有更好的方法可以做到这一点。

我正在创建一个具有react前端和flask后端的网站,并使用sqlite数据库。我的问题是,当我使用session.get((时,它在一个函数中返回None,而在另一个函数则不返回。

在这个函数中,session.get((返回正确的用户id,因此该函数能够正确地将数据添加到数据库中。即使我以其他用户身份登录,用户id也会更改。

@app.route('/addlist', methods=['GET','POST'])
def addlist():
if request.method == 'POST':
user_id = session.get("user_id")
list_name = request.form['ListName']
color = request.form['color']
new_list = ListOfLists(user_id = user_id,name = list_name,color=color)
db.session.add(new_list)
db.session.commit()
return redirect('http://localhost:3000/userPage')

但是当我尝试在前端获取列表时,session.get('user_id'(返回None,因此我无法获取用户的列表。

@app.route('/getlists', methods=['GET', 'POST'])
def getlists():
user_id = session.get('user_id')
print("USER ID: {}".format(user_id))
lists = ListOfLists.query.filter_by(user_id=1).all()
return jsonify(lists)

打印输出:USER ID: None

函数本身肯定有效,因为当我将.filter_by(user_id=user_id)更改为.filter_by(user_id=1)时,数据库中的用户id为1,它实际上将我在数据库中的正确列表发送到了前端。


这里是应用程序配置、注册和登录端点,以及获取列表的javascript函数(如果感兴趣的话(:

from flask import Flask, request, redirect, session, jsonify
from flask_session import Session
from flask_sqlalchemy import SQLAlchemy
from flask_cors import CORS
#flask app initialization
app = Flask(__name__)
app.config["SECRET_KEY"] = "changeme"
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
db = SQLAlchemy(app)
app.config["SESSION_TYPE"] = "sqlalchemy"
app.config['SESSION_SQLALCHEMY'] = db
Session(app)
CORS(app)
@app.route('/register', methods = ['GET', 'POST'])
def register():
if request.method == 'POST':
username = request.form['email']
password = request.form['password']
new_user = User(username=username, password=password) #user table constructor
db.session.add(new_user)
db.session.commit()
return redirect('http://localhost:3000/mainpage')
@app.route('/login', methods=['GET', 'POST'])
def Login():
if request.method == 'POST':
username = request.form['email']
password = request.form['password']
user = User.query.filter_by(username = username).first()
if user and user.password == password:
#save user to session
session['user_id'] = user.id
return redirect('http://localhost:3000/userPage')
import React, { useState, useEffect } from 'react';
export default function GetLists() {
const [lists, setLists] = useState('');
useEffect(() => {
fetch('http://localhost:5000/getlists')
.then(response => response.json())
.then(data => console.log(data))
},[]);
//return currently doesn't matter as I am only console.log-ing the data
return (...);
}

编辑1:

当我手动转到http://localhost:5000/getlists时,我注意到打印输出是USER ID: 1(正确的用户id(,但当我在javascript 中使用fetch((时,输出是None

您的会话存储在一个名为session的cookie中。根据本文,fetch默认情况下不发送cookie。

要在您的请求中包含会话cookie,请尝试以下操作:

fetch(url, {
credentials: "same-origin"
}).then(...).catch(...);

最新更新