Python flask登录时出错

Python flask登录时出错,python,python-2.7,flask,flask-login,Python,Python 2.7,Flask,Flask Login,我很难使用Flask登录框架进行身份验证。我已经尽可能彻底地阅读了文档,但显然我遗漏了一些明显的东西 class User(): def __init__(self, userid=None, username=None, password=None): self.userid = userid self.username = username self.password = password def is_authenticat

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

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
上面是我的用户加载程序

@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\u required
修饰的视图时,它会将我重定向到登录表单。据我所知,
login\u user
函数实际上没有工作,尽管我调用它时它返回
True
。感谢您的建议。

如果您已经确认这不是您的
登录用户
功能,那么您的
按id查找功能就剩下了

用户加载程序的源代码说明:

您设置的函数应获取用户ID(unicode)并返回用户对象,如果用户不存在,则返回用户对象,或返回用户对象

您的
find_by_id
函数使用了
find_one_或_404
,这让人大吃一惊。我将围绕该函数添加一些额外的调试,添加一些打印或日志,以显示正在使用正确的unicode id调用它,并且它正在返回一个
User
对象,或者
None


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

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

session['user_id'] = form.user.id

以Github为例看看这个问题

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

关键问题是我试图使用MongoDB集合中的
\u id
参数作为用户id。我没有意识到
\u 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
适当修改这两个函数修复了此错误

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