簡體   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