Лучший способ наследования от таблицы пользователя (SQLAlchemy & UserMixin) - PullRequest
0 голосов
/ 15 февраля 2020

У меня есть таблица 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 (), которые должны быть определены в производных таблицах для каждой социальной сети.

Псевдокод для этого:

Base user

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

Google user

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)

E-mail user

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? Спасибо за любую помощь заранее.

1 Ответ

0 голосов
/ 16 февраля 2020

Обычно я создаю модель 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 также рекомендует это

Надеюсь, что все прояснится!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...