Flask 未保留会话

问题描述 投票:0回答:1

我正在尝试使用 Flask 为网站创建后端

当用户移动到另一个页面时,Flask 不会保留会话。我尝试了谷歌搜索前 10 页的每一个解决方案。

这是我的后端(删除了不相关的功能和代码):

from flask import Flask, request, jsonify, make_response, session,redirect, url_for
from flask_cors import CORS, cross_origin
import logging
import sqlite3

app = Flask(__name__,template_folder="../templates", static_folder="../static")
logging.basicConfig(level=logging.DEBUG)

CORS(app, resources={r"/*": {"origins": "*"}}, supports_credentials=True)
app.secret_key = "166"  #don't look!!!
app.config.update(SESSION_COOKIE_SAMESITE=None, SESSION_COOKIE_SECURE=True)


# get the user info example
def get_user(username):
    connection = sqlite3.connect('users.db')
    cursor = connection.cursor()
    cursor.execute('SELECT * FROM users WHERE username = ?', (username,))
    user = cursor.fetchone()
    connection.close()
    return user

# get the current user from the seasion
@app.route('/get_current_user', methods=['GET'])
@cross_origin(supports_credentials=True)
def get_current_user():
    if "username" in session:
        return session["username"]
    else:
        return "not logged in"



    return True
@app.route('/register', methods=['POST'])
@cross_origin(supports_credentials=True)
def register():
    data = request.form
    username = data['username']
    password = data['password']
  
   .....

    # Check if the user already exists
    # Add the user to the DB
    # Create a session for the user after successful registration
    session['username'] = username
    session.permanent = True
  ....

    return response

if __name__ == '__main__':
    create_database()
    app.run(debug=True,port=1661,host='0.0.0.0')

如您所见,我在各处添加了

SESSION_COOKIE_SAMESITE="None
SESSION_COOKIE_SECURE=True configs, and I use 
supports_credentials=True`。但它不起作用。

我也没有忘记在 JavaScript 代码中使用凭据。

fetch('http://xx.xx.xx.xx:1661/get_current_user', {credentials: 'include'})
  .then(response => response.text())
  .then(username => {
    // Update the content of #user-name with the retrieved username
    const userNameElement = document.getElementById('user-name');
    userNameElement.textContent = username;
  })
  .catch(error => {
    console.error('Error fetching user data:', error);
    // Handle the error if needed
  });

发生的事情是这样的

  1. 用户使用 /register 进行注册
  2. 会话已创建
  3. 然后使用 JavaScript herf 将用户重定向到 /user
  4. 在此页面中,用户的客户端发送 GET 请求以使用 /get_current_user 从服务器获取用户名
  5. 代码到达
    return "not logged in"
    部分。

没有错误。

javascript python http flask
1个回答
0
投票

经过大量故障排除后回答我自己的问题。

我认为问题是浏览器没有发送 cookie,因为它是跨域(不同端口)而没有 HTTPS。

如果我理解正确的话,如果不启用 HTTPS 或避免跨域请求,就无法使其工作。

我选择通过让所有内容都从 Flask 服务器运行来避免跨域请求。

© www.soinside.com 2019 - 2024. All rights reserved.