我正在开发一个需要身份验证的flask应用程序。我已经连接上了flask-login,但它看起来不是很优雅。
首先,flask-login需要确保用户存在:
@login_manager.user_loader
def load_user(id):
return User.query.get(id)但是您还需要使用'login_user‘来创建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的一个模型,而SignedInUser只是一个用于flask登录的对象。
有没有人有使用postgres的flask-login的例子?
发布于 2012-02-08 04:07:20
看起来你可能误解了Flask-Login处理的是什么。它的作用是在告诉用户身份验证成功后(通过调用login_user)跟踪有关用户会话的所有信息。user_loader回调只告诉它如何为已经通过身份验证的用户重新加载对象,比如当有人重新连接到“记住我”会话时。文档对此并不是特别清楚。
应该不需要在数据库中为用户的登录状态保留一个标志。此外,如果凭据不正确( AttributeError = None),则包含的代码将引发用户。
下面是一个Flask-SQLAlchemy应用程序的示例。它使用外部身份验证源和SQLAlchemy用户对象的包装器,但过程基本上是相同的。
user_loader回调:
@login_manager.user_loader
def load_user(user_id):
user = User.query.get(user_id)
if user:
return DbUser(user)
else:
return NoneUser类( 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登录处理程序:
@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_user returns False (user.is_active() == False)注销
@app.route('/logout')
@login_required
def logout():
logout_user()
flash('You have logged out')
return(redirect(url_for('login')))https://stackoverflow.com/questions/9095923
复制相似问题