簡體   English   中英

燒瓶登錄時出錯

[英]Error with flask-login

我很難使用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)

以上是我的用戶加載器。

@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 任何建議表示贊賞

經過調試器一段時間后,我終於解決了問題。

關鍵問題是我試圖使用MongoDB集合中的_id參數作為用戶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

修改這兩個函數可以正確修復此錯誤。

如果您已經驗證它不是您的login_user函數,那么會留下您的find_by_id函數。

user_loader的源代碼說:

您設置的功能應該使用用戶ID( unicode )並返回用戶對象,如果用戶不存在則返回None

你的find_by_id函數使用find_one_or_404引起了人們的注意。 我會在該函數周圍添加一些額外的調試,添加一些打印,或者使用正確的unicode id來顯示它被調用,並且它返回一個User對象,或者None

希望這會讓你更接近縮小問題范圍。

在驗證表單后,我似乎找不到將user_id分配給會話的位置:

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

以Github上的SimpleRegistrationForm為例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM