使用flask-login和postgresql

Jay*_*Jay 9 postgresql flask

我正在研究需要身份验证的烧瓶应用程序.我已经连接了登录烧瓶,但它看起来并不优雅.

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

@login_manager.user_loader
def load_user(id):
    return User.query.get(id)
Run Code Online (Sandbox Code Playgroud)

但是您还需要使用'login_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
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,'User'是postgres的模型,SignedInUser只是一个用于flask-login的对象.

有没有人有一个与postgres一起使用烧瓶登录的例子?

rob*_*jpg 38

看起来你可能误解了Flask-Login的处理方式.在您告知身份验证成功后(通过调用login_user),可以跟踪用户会话的所有内容.user_loader回调仅告诉它如何为已经过身份验证的用户重新加载对象,例如当有人重新连接到"记得我"会议.文档在这方面并不是特别清楚.

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

这是Flask-SQLAlchemy应用程序的一个示例.它使用外部身份验证源和SQLAlchemy User对象的包装器,但过程基本相同.

user_loader回调:

@login_manager.user_loader
def load_user(user_id):
    user = User.query.get(user_id)
    if user:
        return DbUser(user)
    else:
        return None
Run Code Online (Sandbox Code Playgroud)

用户类(SQLAlchemy对象的包装器):

# User class
class DbUser(object):
    """Wraps User object for Flask-Login"""
    def __init__(self, user):
        self._user = user

    def get_id(self):
        return unicode(self._user.id)

    def is_active(self):
        return self._user.enabled

    def is_anonymous(self):
        return False

    def is_authenticated(self):
        return True
Run Code Online (Sandbox Code Playgroud)

登录处理程序

@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)
Run Code Online (Sandbox Code Playgroud)

请注意,如果登录失败:

  • 外部认证失败
  • 用户查询返回None(用户不存在)
  • login_user返回False(user.is_active() == False)

登出

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