通过postgresql使用flask登录

通过postgresql使用flask登录,postgresql,flask,Postgresql,Flask,我正在开发一个需要验证的flask应用程序。我已经接好了,但看起来不太优雅 首次登录需要确保用户存在: @login_manager.user_loader def load_user(id): return User.query.get(id) 但是您还需要使用“login\u user”来创建用户对象 # Some code above user = User.query.filter_by(email = form.email.data, password = form.p

我正在开发一个需要验证的flask应用程序。我已经接好了,但看起来不太优雅

首次登录需要确保用户存在:

@login_manager.user_loader
def load_user(id):
    return User.query.get(id)
但是您还需要使用“login\u user”来创建用户对象

# Some code above 
  user = User.query.filter_by(email = form.email.data, password = form.password.data).first()
  user.login_status = 1
  db.session.commit()
  login_user(objects.SignedInUser(user.id, user.email, user.login_status == LoginStatus.Active))    
# Some code below
在上面的代码中,“User”是postgres的模型,SignedUser只是用于登录的对象


有人举过一个与postgres一起使用flask登录的例子吗?

看起来你可能误解了flask登录处理的是什么。在您告诉用户身份验证成功(通过调用
login\u user
)后,它可以跟踪有关用户会话的所有信息
user\u loader
回调仅告诉它如何为已通过身份验证的用户重新加载对象,例如当有人重新连接到“记住我”会话时。文件对此并不特别清楚

不需要在数据库中为用户的登录状态保留标志。此外,如果凭据不正确(user=None),您包含的代码将引发AttributeError

下面是一个炼金术应用程序的示例。它使用外部身份验证源和SQLAlchemy用户对象的包装器,但过程基本相同

用户加载程序回调:

@login_manager.user_loader
def load_user(user_id):
    user = User.query.get(user_id)
    if user:
        return DbUser(user)
    else:
        return None
用户类(SQLAlchemy对象的包装器):

登录处理程序:

@app.route('/login', methods=['GET', 'POST'])
def login():
    error = None
    next = request.args.get('next')
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']


        if authenticate(app.config['AUTH_SERVER'], username, password):
            user = User.query.filter_by(username=username).first()
            if user:
                if login_user(DbUser(user)):
                    # do stuff
                    flash("You have logged in")

                    return redirect(next or url_for('index', error=error))
        error = "Login failed"
    return render_template('login.html', login=True, next=next, error=error)
请注意,在以下情况下登录失败:

  • 外部身份验证失败
  • 用户查询返回无(用户不存在)
  • login\u user
    返回False(
    user.is\u active()==False
注销

@app.route('/logout')
@login_required
def logout():
    logout_user()
    flash('You have logged out')
    return(redirect(url_for('login')))

您需要注销方法所需的@login_什么类型的内容属于“if login_user(DbUser(user)):#do stuff”?@Mittenchops建立会话变量、执行通知、记录事件等。
@app.route('/logout')
@login_required
def logout():
    logout_user()
    flash('You have logged out')
    return(redirect(url_for('login')))