(sqlite,Flask + React),flask session session.get() 返回 None [重复]

Posted

技术标签:

【中文标题】(sqlite,Flask + React),flask session session.get() 返回 None [重复]【英文标题】:(sqlite, Flask + React), flask session session.get() returns None [duplicate] 【发布时间】:2022-01-08 12:44:07 【问题描述】:

我在这个问题上花了太多时间,我认为我只是做错了什么,还有更好的方法来解决这个问题。

我正在创建一个带有反应前端和烧瓶后端的网站,以及 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

该函数本身确实有效,因为当我将数据库中的用户 ID 为 1 的 .filter_by(user_id=user_id) 更改为 .filter_by(user_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

【问题讨论】:

我认为这与问题无关,但您缺少 useEffect 依赖数组。相关,如果您在反应代码之外点击http://localhost:5000/getlists,它会返回您期望的数据吗?我不认为这是提供的代码的前端/反应问题。看到 '/getlists' 路由没有指定 METHOD,虽然我不知道这是否重要。 @DrewReese 没有注意到缺少依赖数组,添加它。但是是的,问题肯定出在后端,因为当我使用数字查询表并转到http://localhost:5000/getlists 时,它实际上向我显示了 json 数据。我还添加了方法,但没有任何区别。谢谢你的回答。 好吧,我在 python 和任何与 python 相关的东西方面的​​经验几乎为零。如果您同意这是后端的问题,我倾向于删除react-hooks 标签,因为它无关紧要。我将离开 JS 并切换到 React,也许更熟悉技术堆栈的人可以提供帮助。 @DrewReese 当我手动转到http://localhost:5000/getlists 时,我注意到打印输出是USER ID: 1(正确的用户ID),但是当我使用fetch() 时输出是None。再次感谢。 【参考方案1】:

您的会话存储在一个名为 session 的 cookie 中。 根据this article,fetch 默认不发送cookies。

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

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

【讨论】:

以上是关于(sqlite,Flask + React),flask session session.get() 返回 None [重复]的主要内容,如果未能解决你的问题,请参考以下文章

python web开发-flask连接sqlite数据库

flask+sqlite3+echarts2+ajax数据可视化

Flask:操作SQLite3(0.1)

[Python-Flask-SQLite]学生管理系统V1.0

Flask OperationalError:无法使用 sqlite3 打开数据库文件

使用 Flask SQLAlchemy 从 SQLite 切换到 MySQL