繁体   English   中英

flask_login 的多个用户

[英]multiple user for flask_login

我有两个用于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

我想知道如何从两个模型加载用户。

这是我迄今为止一直在使用的解决方案,我不知道它的缺陷,但它是您正在寻找的答案。

假设您有多个帐户类型,关键是在登录时使用会话来存储该帐户类型,并像这样使用它:

@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,您可以通过以下方式实现它们:

  • 为不同的用户类型创建不同的路由。
  • 在登录表单中添加一个选择字段,为所有用户类型提供一个路由。

线程提供了有关会话以及如何保护它们的更多信息,您应该查看它。

我知道您选择将类分开,但考虑将公共属性合并到一个父类中,只留下 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)

由于父表是抽象的,它不会被创建,但它的子表会被创建。

#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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM