首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >flask-login出错

flask-login出错
EN

Stack Overflow用户
提问于 2013-06-13 16:52:17
回答 3查看 3.2K关注 0票数 4

我很难使用Flask-Login框架进行身份验证。我已经尽可能彻底地阅读了文档,但显然我遗漏了一些明显的东西。

代码语言:javascript
复制
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

上面是位于users/models.py中的User类

代码语言:javascript
复制
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)

上面是我的用户加载器。

代码语言:javascript
复制
@mod.route('/login/', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        pw_hash = hashlib.md5(form.password.data).hexdigest()
        user = find_by_username(form.username.data)
        if user is not None:
            if user.password == pw_hash:
                if login_user(user):
                    flash('Logged in successfully.')
                    return redirect(request.args.get('next') or url_for('users.test'))
                else:
                    flash('Error')

        else:
            flash('Username or password incorrect')

    else:
        flash('Username or password incorrect')

return render_template('users/login.html', form=form)

没有明显的错误消息,但是当尝试访问任何用@login_required修饰的视图时,它会将我重定向到登录表单。据我所知,尽管我调用login_user函数时返回了True,但它实际上并没有工作。任何建议都很感谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-22 15:55:09

在调试了一段时间后,我终于解决了这个问题。

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

代码语言:javascript
复制
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

适当地修改这两个函数可以修复此错误。

票数 3
EN

Stack Overflow用户

发布于 2013-06-13 22:07:58

如果你已经确认它不是你的login_user函数,那么就剩下你的find_by_id函数了。

user_loader的源代码是这样的:

您设置的函数应该接受一个用户ID (一个unicode)并返回一个用户对象,如果用户不存在,则返回None

您的find_by_id函数使用了令人惊讶的find_one_or_404。我会在该函数周围添加一些额外的调试,添加一些打印或日志记录,以显示它正在使用正确的unicode id被调用,并且它正在返回一个User对象或None

希望这将使您更接近缩小问题的范围。

票数 1
EN

Stack Overflow用户

发布于 2013-06-19 18:38:15

在验证表单后,我似乎找不到将user_id分配给会话的位置:

代码语言:javascript
复制
session['user_id'] = form.user.id

以Github上的这个SimpleRegistrationForm为例

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17082933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档