Python 当前用户并不总是可用
对以下几点有什么想法 这是我的用户类:Python 当前用户并不总是可用,python,flask,flask-login,flask-socketio,Python,Flask,Flask Login,Flask Socketio,对以下几点有什么想法 这是我的用户类: class UserType(db.Document): firstName = db.StringField() lastName = db.StringField() email = db.StringField() passwordHash = db.StringField() created = db.DateTimeField() lastEdit = db.DateTimeField() lastSignIn = db.DateTimeFiel
class UserType(db.Document):
firstName = db.StringField()
lastName = db.StringField()
email = db.StringField()
passwordHash = db.StringField()
created = db.DateTimeField()
lastEdit = db.DateTimeField()
lastSignIn = db.DateTimeField()
hostOrTest = db.StringField()
def to_json(self):
return jsonify({
'_id': str(self.pk),
'First Name': self.firstName,
'Last Name': self.lastName,
'Email': self.email,
'Creation Date': self.created,
'Edit Date': self.lastEdit,
'Last Sign In': self.lastSignIn,
'hostOrTest': self.hostOrTest
})
def is_authenticated(self):
return True
def is_active(self):
return True
def is_anonymous(self):
return False
def get_id(self):
return str(self.pk)
@property
def host(self):
if self.hostOrTest == "host":
return True
else:
return False
@property
def test(self):
if self.hostOrTest == 'test':
return True
else:
return False
这是我的登录端点:
@app.route("/api/Login", methods=["POST"])
def login():
request_data = request.get_json()
email = request_data["email"]
if 'passwordHash' in request_data:
passwordHash = request_data["passwordHash"]
else:
passwordHash = request_data["email"]
userObj = UserType.objects(email=email, passwordHash=passwordHash).first()
if userObj:
login_user(userObj, remember=True, fresh=False)
userObj.update(lastSignIn=datetime.datetime.now())
return(jsonify('success'), 200)
else:
return(jsonify("Username or password error"), 401)
@app.route("/api/isUserLoggedIn", methods=["GET"])
def apiIsUserLoggedIn():
if current_user.is_authenticated:
print(f"User ID is {current_user.get_id()}")
return('True')
elif not current_user.is_authenticated:
return('False')
这一切都按预期进行,当我询问服务器以查看用户是否使用端点登录时:
@app.route("/api/Login", methods=["POST"])
def login():
request_data = request.get_json()
email = request_data["email"]
if 'passwordHash' in request_data:
passwordHash = request_data["passwordHash"]
else:
passwordHash = request_data["email"]
userObj = UserType.objects(email=email, passwordHash=passwordHash).first()
if userObj:
login_user(userObj, remember=True, fresh=False)
userObj.update(lastSignIn=datetime.datetime.now())
return(jsonify('success'), 200)
else:
return(jsonify("Username or password error"), 401)
@app.route("/api/isUserLoggedIn", methods=["GET"])
def apiIsUserLoggedIn():
if current_user.is_authenticated:
print(f"User ID is {current_user.get_id()}")
return('True')
elif not current_user.is_authenticated:
return('False')
它按预期工作,并且打印到控制台的是用户ID
但是,当我运行此函数时:
@app.route('/socketIO/API/createRoom', methods=["POST"])
@socketio.event
#@login_required
def createRoom():
quizId = ''.join(random.choice(string.ascii_lowercase)
for i in range(6))
questions = []
timeLimit = 5
quizStarted = 'False'
print(f"User ID is {current_user.get_id()}")
activeRooms = ActiveRooms(
roomId=quizId,
connectedUserId=[current_user.get_id()],
allConnectedUsers=[current_user.get_id()],
dateTime=datetime.datetime.now(),
questions=questions,
timeLimit=timeLimit,
quizStarted=quizStarted,
currentQuestion="null"
)
activeRooms.save()
print(f'room created with quiz ID: {quizId}')
# CHANGEBACK emit(f'ID {quizId}')
return(f'ID {quizId}')
这些都是同一个文件的一部分,在createRoom函数中,每次都不会打印用户ID,即使在IsUserLoggedIn函数中,它工作正常
有什么想法吗
PS这是我在StackOverflow上的第一篇帖子,所以我希望我没有把事情搞砸!:)
谢谢 您使用的是
self.pk
,但我看不到在任何地方定义了它。这应该是主键吗?因为您可能需要为属性设置primary\u key=True
(例如email=db.StringField(primary\u key=True)
)Hi,self.pk只是在mongo数据库中返回自动分配的ID。您确定定义了吗?你能试着为某个用户打印get_id()吗?是的,这肯定是在“/api/isUserLoggedIn”端点中工作的,它按预期工作我很抱歉,但我当时不知道。我能注意到的唯一奇怪的事情是,该函数既是一个路由,也是一个socketio事件。通常这些都是独立的函数,请看这个例子:好的,谢谢,很可能你是正确的,因为我有其他的HTTP端点,它们似乎可以工作。非常感谢你!Socket.IO连接何时建立?用户登录之前或之后?socketIO连接在用户登录之前建立。这会影响事情吗?是的。课程的工作方式在中进行了说明。我还在我的博客上写了一篇关于使用Flask-SocketIO管理会话的不同选项的文章。您好,是的,我已经阅读了您的文章和文档,但我似乎找不到让我的登录端点将当前用户数据注册到与套接字io连接相同的会话的方法。如果我让用户使用http登录,然后启动套接字连接,该连接会自动加入同一会话吗?(socketio没有处理会话)您正试图做的正是一个不受支持的用例。你有两个选择。1) 切换到服务器端会话(可能使用Flask会话)并设置manage_Session=False。2) 延迟Socket.IO连接,直到使用用户的登录状态更新会话cookie。