我有一个SQLALchemy表:
class User(db.Model, UserMixin):
user_id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(100), nullable=False, unique=True)
password_hash = db.Column(db.String(40), nullable=False)
但我希望用户能够通过使用用户名和密码创建新帐户或使用社交媒体帐户(google/twitter/vk.com(来登录和注册。我的想法是有一个基本的User表,该表将具有get_name((之类的抽象方法,这些方法必须在每个社交媒体的派生表中定义。
伪代码:
基本用户
class User(db.Model, UserMixin):
user_id = db.Column(db.Integer, primary_key=True)
# Overridden method from UserMixin
def get_id(self):
return self.user_id
def get_name(self): raise NotImplementedError
谷歌用户
class GoogleUser(User):
first_name = db.Columnn(db.String(40), nullable=False)
last_name = db.Columnn(db.String(40), nullable=False)
def get_name(self):
return '{} {}'.format(self.first_name, self.last_name)
电子邮件用户
class EmailUser(User):
username = db.Column(db.String(100), nullable=False, unique=True)
password_hash = db.Column(db.String(40), nullable=False)
def get_name(self):
return self.username
问题是使用SQLAlchemy和UserMixin实现它的最佳方法是什么? 提前感谢您的任何帮助。
我通常做的是创建一个User
模型,其中包含应用程序所需的所有信息,例如
class User(db.Model, UserMixin):
user_id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(100), nullable=False, unique=True)
password_hash = db.Column(db.String(40), nullable=True)
然后,对于第三方服务身份验证,我创建一个表,用于存储应用程序所需的有关该服务的令牌和其他相关数据。
class GoogleUser(db.Model):
first_name = db.Column(db.String(40), nullable=False)
last_name = db.Column(db.String(40), nullable=False)
google_token = db.Column(db.String(200), nullable=False)
我通过外键将这个新表连接到User
模型:
google_user_id = db.Column(db.Integer, db.ForeignKey("google_user.id"))
这样,用户可以轻松连接其第三方帐户,并在您的应用程序上拥有一个帐户。
Facebook Login的文档也建议这样做
希望它能解决问题!