我有两个用于flask_login的用户模型。:
class Admin(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(30))
password_hash = db.Column(db.String(200))
class Merchant(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(30))
password_hash = db.Column(db.String(200))
现在我想在会话中加载用户:
@login_manager.user_loader
def load_user(user_id):
pass
我想知道如何从两个模型加载用户。
答案 0 :(得分:1)
#You can create a permission
admin_permission = Permission(RoleNeed('admin'))
#protect a view with a principal for that need
@app.route('/admin')
@admin_permission.required()
def do_admin_index():
return Response('Only if you are an admin)
答案 1 :(得分:1)
到目前为止,这是我一直使用的解决方案,我不知道它的缺点,但这是您正在寻找的答案。
假设您有多种帐户类型,关键是使用会话在登录时存储该帐户类型,并像这样使用它:
@login_manager.user_loader
def load_user(user_id):
if session['account_type'] == 'Admin':
return Admin.query.get(int(user_id))
elif session['account_type'] == 'Merchant':
return Merchant.query.get(int(user_id))
else:
return None
不需要提供路由和html,您可以通过以下方式实现它们:
此thread提供了有关会话以及如何保护会话的更多信息,您应该将其签出。
我知道您可以选择将类分开,但是可以考虑将commun属性合并到一个父类中,只保留id来防止外键问题,例如:
class Person(db.Model):
__abstract__ = True
name = db.Column(db.String(30))
password_hash = db.Column(db.String(200))
class Admin(Person, UserMixin):
id = db.Column(db.Integer, primary_key=True)
class Merchant(Person, UserMixin):
id = db.Column(db.Integer, primary_key=True)
由于父表是抽象表,因此不会创建它,但是将创建其子表。