Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当前用户并不总是可用_Python_Flask_Flask Login_Flask Socketio - Fatal编程技术网

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。