Хранение

Различные фреймворки поддерживают различные ORM, Storage решает проблему различных интерфейсов, перемещая общий API в классы mixins. Эти миксины используются в приложениях при определении различных моделей, используемых python-social-auth.

Социальный пользователь

Эта модель связывает данные социального аккаунта с пользователем в системе, она содержит имя провайдера и ID пользователя (uid), которые должны идентифицировать социальный аккаунт в удаленном провайдере, плюс некоторые дополнительные данные (extra_data), которые представляют собой JSON закодированное поле с дополнительной информацией от провайдера (обычно аватары и подобное).

При реализации этой модели она должна наследоваться от UserMixin и расширять необходимые методы:

  • Имя пользователя:

    @classmethod
    def get_username(cls, user):
        """Return the username for given user"""
        raise NotImplementedError('Implement in subclass')
    
    @classmethod
    def username_max_length(cls):
        """Return the max length for username"""
        raise NotImplementedError('Implement in subclass')
    
  • Модель пользователя:

    @classmethod
    def user_model(cls):
        """Return the user model"""
        raise NotImplementedError('Implement in subclass')
    
    @classmethod
    def changed(cls, user):
        """The given user instance is ready to be saved"""
        raise NotImplementedError('Implement in subclass')
    
    @classmethod
    def user_exists(cls, username):
        """
        Return True/False if a User instance exists with the given arguments.
        Arguments are directly passed to filter() manager method.
        """
        raise NotImplementedError('Implement in subclass')
    
    @classmethod
    def create_user(cls, username, email=None):
        """Create a user with given username and (optional) email"""
        raise NotImplementedError('Implement in subclass')
    
    @classmethod
    def get_user(cls, pk):
        """Return user instance for given id"""
        raise NotImplementedError('Implement in subclass')
    
  • Социальный пользователь:

    @classmethod
    def get_social_auth(cls, provider, uid):
        """Return UserSocialAuth for given provider and uid"""
        raise NotImplementedError('Implement in subclass')
    
    @classmethod
    def get_social_auth_for_user(cls, user):
        """Return all the UserSocialAuth instances for given user"""
        raise NotImplementedError('Implement in subclass')
    
    @classmethod
    def create_social_auth(cls, user, uid, provider):
        """Create a UserSocialAuth instance for given user"""
        raise NotImplementedError('Implement in subclass')
    
  • Социальная разобщенность:

    @classmethod
    def allowed_to_disconnect(cls, user, backend_name, association_id=None):
        """Return if it's safe to disconnect the social account for the
        given user"""
        raise NotImplementedError('Implement in subclass')
    
    @classmethod
    def disconnect(cls, name, user, association_id=None):
        """Disconnect the social account for the given user"""
        raise NotImplementedError('Implement in subclass')
    

Nonce

This is a helper class for OpenID mechanism, it stores a one-use number, shouldn’t be used by the project since it’s for internal use only.

When implementing this model, it must inherit from NonceMixin, and override the needed methods:

@classmethod
def use(cls, server_url, timestamp, salt):
    """Create a Nonce instance"""
    raise NotImplementedError('Implement in subclass')

@classmethod
def get(cls, server_url, salt):
    """Retrieve a Nonce instance"""
    raise NotImplementedError('Implement in subclass')

@classmethod
def delete(cls, nonce):
    """Delete a Nonce instance"""
    raise NotImplementedError('Implement in subclass')

Ассоциация

Another OpenID helper class, it stores basic data to keep the OpenID association. Like Nonce this is for internal use only.

При реализации этой модели, она должна наследоваться от AssociationMixin, и переопределять необходимые методы:

@classmethod
def store(cls, server_url, association):
    """Create an Association instance"""
    raise NotImplementedError('Implement in subclass')

@classmethod
def get(cls, *args, **kwargs):
    """Get an Association instance"""
    raise NotImplementedError('Implement in subclass')

@classmethod
def remove(cls, ids_to_delete):
    """Remove an Association instance"""
    raise NotImplementedError('Implement in subclass')

Код проверки

Этот класс используется для отслеживания кодов проверки электронной почты после обычного механизма проверки электронной почты, заключающегося в отправке пользователю письма с уникальным кодом. Эта модель используется частичным конвейером social_core.pipeline.mail.mail_validation. Ознакомьтесь с документацией по адресу Email validation в pipeline docs.

При реализации модели для вашего фреймворка необходимо переопределить только один метод:

@classmethod
def get_code(cls, code):
    """Return the Code instance with the given code value"""
    raise NotImplementedError('Implement in subclass')

Интерфейс хранения

Существует вспомогательный класс, используемый стратегиями для скрытия имен реальных моделей под общим API, экземпляр этого класса используется стратегиями для доступа к модулям хранения.

При реализации этого класса он должен наследоваться от BaseStorage, добавить необходимые ссылки на модели и реализовать необходимый метод:

class StorageImplementation(BaseStorage):
    user = UserModel
    nonce = NonceModel
    association = AssociationModel
    code = CodeModel

    @classmethod
    def is_integrity_error(cls, exception):
        """Check if given exception flags an integrity error in the DB"""
        raise NotImplementedError('Implement in subclass')

Миксины SQLAlchemy и Django

В настоящее время существуют частичные реализации миксинов для SQLAlchemy ORM и Django ORM с общим кодом, используемым позже в текущих реализованных приложениях.

Примечание

При использовании SQLAlchemy ORM и ZopeTransactionExtension рекомендуется использовать для их обработки приложение transaction.

Примеры моделей

Проверьте текущие реализации для Django App, Flask App, Pyramid App и Webpy App для примеров реализации.

Вернуться на верх