我正在尝试使用 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
});
发生的事情是这样的
return "not logged in"
部分。没有错误。
经过大量故障排除后回答我自己的问题。
我认为问题是浏览器没有发送 cookie,因为它是跨域(不同端口)而没有 HTTPS。
如果我理解正确的话,如果不启用 HTTPS 或避免跨域请求,就无法使其工作。
我选择通过让所有内容都从 Flask 服务器运行来避免跨域请求。