为了账号安全,请及时绑定邮箱和手机立即绑定

flask登录时出错

flask登录时出错

UYOU 2021-03-31 11:15:28
我在使用Flask-Login框架进行身份验证时遇到困难。我已尽可能详尽地浏览了文档,但显然我遗漏了一些明显的内容。class User():    def __init__(self, userid=None, username=None, password=None):        self.userid = userid        self.username = username        self.password = password    def is_authenticated(self):        return True    def is_active(self):        return True    def is_anonymous(self):        return False    def get_id(self):        return unicode(self.userid)    def __repr__(self):        return '<User %r>' % self.usernamedef find_by_username(username):    try:        data = app.mongo.db.users.find_one_or_404({'username': username})        user = User()        user.userid = data['_id']        user.username = data['username']        user.password = data['password']        return user    except HTTPException:        return Nonedef find_by_id(userid):    try:        data = app.mongo.db.users.find_one_or_404({'_id': userid})        user = User(data['_id'], data['username'], data['password'])        return user    except HTTPException:        return None上面是我的User类,位于 users/models.pylogin_manager = LoginManager()login_manager.init_app(app)login_manager.login_view = 'users.login'@login_manager.user_loaderdef load_user(userid):return find_by_id(userid)上面是我的用户加载器。显然有错误消息,但是当尝试访问任何用修饰的视图时@login_required,它会将我重定向到登录表单。据我所知,该login_user函数实际上并不起作用,尽管它True在我调用它时返回。任何建议表示赞赏。
查看完整描述

3 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

经过一段时间的调试器,我终于解决了这个问题。


关键问题是我试图_id将MongoDB集合中的参数用作用户ID。我没有意识到_id参数是一种ObjectID类型,而不是我需要的字符串或unicode。


def find_by_username(username):

    try:

        data = app.mongo.db.users.find_one_or_404({'username': username})


        user = User(unicode(data['_id']), data['username'], data['password'])

        return user


    except HTTPException:

        return None



def find_by_id(userid):

    try:

        data = app.mongo.db.users.find_one_or_404({'_id': ObjectId(userid)})

        user = User(unicode(data['_id']), data['username'], data['password'])

        return user

修改两个函数适当地修复了此错误。


查看完整回答
反对 回复 2021-04-01
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

如果您已验证它不是您的login_user功能,那么就离开您的find_by_id功能。

的源代码为user_loader

您设置的函数应带有用户ID(a unicode)并返回用户对象,或者None如果用户不存在。

您的find_by_id功能使用find_one_or_404会引起注意。我将对该函数添加一些额外的调试,添加一些打印信息或进行日志记录,以显示使用正确的unicode id调用了该函数,并且该函数返回了一个User对象或None

希望这可以使您更进一步地缩小问题的范围。


查看完整回答
反对 回复 2021-04-01
  • 3 回答
  • 0 关注
  • 207 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信