Структура пирамиды

Pyramid многоразовые приложения сложны (или я недостаточно способный). Вот подробная информация о том, как включить это приложение в Pyramid.

Зависимости

Pyramid app зависит от sqlalchemy, поддержки других ORM пока нет, но запросы на поддержку приветствуются.

Установка

От pypi:

$ pip install social-auth-app-pyramid

Включение приложения

Приложение может быть просканировано Configurator.scan(), также оно определяет includeme() в файле __init__.py, который добавит необходимые маршруты в конфигурацию вашего приложения. Для сканирования просто добавьте:

config.include('social_pyramid')
config.scan('social_pyramid')

Настройка моделей

В настоящее время модели для python-social-auth определяются внутри функции, поскольку им нужна ссылка на текущий экземпляр БД и модель User, используемую в вашем проекте (см. Ссылка на модель User ниже). Как только конфигурация приложения Pyramid и база данных определены, вызовите init_social для регистрации моделей:

from social_pyramid.models import init_social

init_social(config, Base, DBSession)

Пока я не смог найти другой способ определить модели другим способом, а не делать это как побочный эффект вызова этой функции, поскольку база данных недоступна, а current_app не может быть использована во время инициализации, только во время выполнения.

Ссылка на модель пользователя

Приложение хранит ссылку на модель пользователя, используемую вашим проектом, определите ее с помощью этого параметра:

SOCIAL_AUTH_USER_MODEL = 'foobar.models.User'

Значением должен быть путь импорта к модели User.

Глобальный пользователь

Приложение ожидает, что текущий вошедший пользователь доступен по адресу request.user, пример приложения гарантирует это с помощью этого передатчика:

def get_user(request):
    user_id = request.session.get('user_id')
    if user_id:
        user = DBSession.query(User)\
                        .filter(User.id == user_id)\
                        .first()
    else:
        user = None
    return user

Обработчик добавляется в конфигурацию, выполняя:

config.add_request_method('example.auth.get_user', 'user', reify=True)

Это всего лишь простой пример, возможно, ваш проект делает это лучше.

Вход пользователя в систему

Поскольку приложение не делает никаких предположений о том, как вы собираетесь вводить пользователей в систему, вам необходимо указать это. Для этого определите следующие параметры:

SOCIAL_AUTH_LOGIN_FUNCTION = 'example.auth.login_user'
SOCIAL_AUTH_LOGGEDIN_FUNCTION = 'example.auth.login_required'

Первый должен принять используемую стратегию и экземпляр пользователя, который был создан или получен из базы данных, там вы можете установить id пользователя в сессии или cookies или в другом месте, используемом позже, чтобы получить id снова и загрузить пользователя из базы данных (проверьте фрагмент выше в Global User).

Вторая используется для того, чтобы убедиться, что при вызове представления disconnect пользователь вошел в систему. Она должна принимать экземпляр User и возвращать True или Flase.

Проверьте файл auth.py в примере приложения для получения подробной информации о том, как это делается.

Социальный аутентификатор в контексте шаблонов

Чтобы получить доступ к социальным экземплярам, связанным с пользователем в контексте шаблона, вы можете сделать это, обратившись к атрибуту social_auth в экземпляре пользователя:

<li tal:repeat="social request.user.social_auth">${social.provider}</li>

Также вы можете добавить бэкенды (связанные и не связанные с пользователем), включив эту контекстную функцию в вашем проекте:

from pyramid.events import subscriber, BeforeRender
from social_pyramid.utils import backends

@subscriber(BeforeRender)
def add_social(event):
    request = event['request']
    event.update(backends(request, request.user))

В результате загрузится диктант с записями:

{
    'associated': [...],
    'not_associated': [...],
    'backends': [...]
}

Ключ associated будет иметь все связанные UserSocialAuth экземпляры, относящиеся к данному пользователю. Ключ not_associated будет содержать не связанные имена бэкендов, а ключ backends будет содержать все включенные имена бэкендов.

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