繁体   English   中英

Python Flask 登录 Current_User 并非始终可用

[英]Python Flask Login Current_User Not Always Available

关于以下任何想法?

这是我的用户 Class:

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')

它按预期工作并打印到控制台是用户 ID。

但是,当我运行这个 function 时:

@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 function 中,我每次都得到 User ID is None 打印,即使在我的 IsUserLoggedIn function 中它工作正常。

有任何想法吗?

PS 这是我在 StackOverflow 上的第一篇文章,所以我希望我没有搞砸任何事情::)

谢谢!

您正在使用self.pk ,但我在任何地方都没有看到这个定义。 这应该得到主键吗? 因为那时您可能想为属性设置primary_key=True (例如email = db.StringField(primary_key=True)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM