flask登录时出错

我在使用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.username


def 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 None



def 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.py


login_manager = LoginManager()

login_manager.init_app(app)

login_manager.login_view = 'users.login'


@login_manager.user_loader

def load_user(userid):

return find_by_id(userid)

上面是我的用户加载器。


显然有错误消息,但是当尝试访问任何用修饰的视图时@login_required,它会将我重定向到登录表单。据我所知,该login_user函数实际上并不起作用,尽管它True在我调用它时返回。任何建议表示赞赏。


UYOU
浏览 210回答 3
3回答

慕运维8079593

经过一段时间的调试器,我终于解决了这个问题。关键问题是我试图_id将MongoDB集合中的参数用作用户ID。我没有意识到_id参数是一种ObjectID类型,而不是我需要的字符串或unicode。def find_by_username(username):&nbsp; &nbsp; try:&nbsp; &nbsp; &nbsp; &nbsp; data = app.mongo.db.users.find_one_or_404({'username': username})&nbsp; &nbsp; &nbsp; &nbsp; user = User(unicode(data['_id']), data['username'], data['password'])&nbsp; &nbsp; &nbsp; &nbsp; return user&nbsp; &nbsp; except HTTPException:&nbsp; &nbsp; &nbsp; &nbsp; return Nonedef find_by_id(userid):&nbsp; &nbsp; try:&nbsp; &nbsp; &nbsp; &nbsp; data = app.mongo.db.users.find_one_or_404({'_id': ObjectId(userid)})&nbsp; &nbsp; &nbsp; &nbsp; user = User(unicode(data['_id']), data['username'], data['password'])&nbsp; &nbsp; &nbsp; &nbsp; return user修改两个函数适当地修复了此错误。

吃鸡游戏

如果您已验证它不是您的login_user功能,那么就离开您的find_by_id功能。的源代码为user_loader:您设置的函数应带有用户ID(a&nbsp;unicode)并返回用户对象,或者None如果用户不存在。您的find_by_id功能使用find_one_or_404会引起注意。我将对该函数添加一些额外的调试,添加一些打印信息或进行日志记录,以显示使用正确的unicode id调用了该函数,并且该函数返回了一个User对象或None。希望这可以使您更进一步地缩小问题的范围。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python