簡體   English   中英

current_user.is_authenticated 不能在 flask_login 上工作

[英]current_user.is_authenticated not working on flask_login

我正在使用 flask_login 進行身份驗證,而我的登錄名中的某些內容不起作用。 事實上 current_user 屬性總是假的(或anonymousUserMixin ...)我試圖改變一些東西,但它沒有工作。 我認為 login_user(user) 部分有問題

@login_manager.user_loader
def load_user(user_id):
    try:
        return User.query.get(user_id)
    except:
        return None   

這是我的登錄路由:

@app.route('/login', methods=['GET', 'POST'])
def login():
    if current_user.is_authenticated:
        return redirect('profile', username=current_user.user_id)
    form = LoginForm()
    if form.validate_on_submit():
        email = form.email.data
        user = User.query.filter_by(email=email).first()
        pass_hashed = form.password.data
        if user:
            flash("user.password, pass_hashed" + user.password + "  " + pass_hashed, category="error")
            if pass_hashed == user.password:
                usr = UserData.query.filter_by(email=email).first()
                login_user(user, remember=form.remember.data)
                session['username'] = usr.username
                next = request.args.get('next')
                # if not is_safe_url(next):
                #   return abort(400)
                # return redirect(next or url_for('index'))
                username = usr.username
                return redirect(url_for('profile', username=username))
            flash("wrong password", category="error")
            return redirect(url_for('login'))
        flash("invalid email", category="error")
        return redirect(url_for('login'))
    return render_template('login.html', form=form)

這個是我的用戶 model:

class User(db.Model, UserMixin):
    __tablename__ = 'user'
    user_id = db.Column(db.Integer(), autoincrement=True)
    email = db.Column(db.String(120), primary_key=True, unique=True, nullable=False)
    password = db.Column(db.String(200), nullable=False)

    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.user_id)

    def get(self, id):
        return unicode(self.user_id)

    def __repr__(self):
        return '<Email %r>' % self.email

    def check_password(self, password):
        if self.password == password:
            return True
        else:
            return False

任何幫助表示贊賞。

非常感謝

我有幾個建議:嘗試改變

@login_manager.user_loader
def load_user(user_id):
    try:
        return User.query.get(user_id)
    except:
        return None

至:

@login_manager.user_loader
def load_user(user_id):
    return User.query.filter(User.id == user_id).first()

盡管文檔使用.get() ,但我在某些地方讀到 SQLAlchemy 可能由於 Unicode 的事情而存在一些問題。 進行此更改可能足以使其正常工作。

另一個建議是,如果您實際上並未更改UserMixin方法,則不要覆蓋它們。 (談論您實際上不需要實現的 is_* 方法)

還有一點需要注意的是:

如果您檢查get_id()方法的UserMixin實現,它使用text_type來轉換 id。 也許也可以嘗試使用它而不是內置的unicode

如果沒有任何效果,最后的解決方案是將您的User id 字段從user_id (這有點多余,IMO)更改為id ,因為如果這是 model 標識符,FlaskLogin 知道如何按原樣處理它。

暫無
暫無

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

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