Flask Framework

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

Зависимости

По умолчанию Flask app не зависит от какого-либо бэкенда хранения данных. Есть поддержка SQLAlchemy, MongoEngine и Peewee.

Установка

Установите ядро flask из pypi:

$ pip install social-auth-app-flask

Установите любое из решений для хранения:

$ pip install social-auth-app-flask-sqlalchemy
$ pip install social-auth-app-flask-mongoengine
$ pip install social-auth-app-flask-peewee

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

Приложения определяют Flask Blueprint, который должен быть зарегистрирован после того, как приложение Flask настроено:

from social_flask.routes import social_auth

app.register_blueprint(social_auth)

Для MongoEngine вам нужны следующие настройки:

SOCIAL_AUTH_STORAGE = 'social_flask_mongoengine.models.FlaskStorage'

Для Peewee вам нужна следующая настройка:

SOCIAL_AUTH_STORAGE = 'social_flask_peewee.models.FlaskStorage'

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

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

from social_flask_sqlalchemy.models import init_social

init_social(app, session)

Для MongoEngine:

from social_flask_mongoengine.models import init_social

init_social(app, session)

Для Пиви:

from social_flask_peewee.models import init_social

init_social(app, session)

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

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

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

SOCIAL_AUTH_USER_MODEL = 'foobar.models.User'

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

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

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

@app.before_request
def global_user():
    g.user = get_current_logged_in_user

Flask-Login

Приложение довольно хорошо работает с Flask-Login, убедитесь, что у вас есть обработчики, похожие на эти:

@login_manager.user_loader
def load_user(userid):
    try:
        return User.query.get(int(userid))
    except (TypeError, ValueError):
        pass


@app.before_request
def global_user():
    g.user = login.current_user


# Make current user available on templates
@app.context_processor
def inject_user():
    try:
        return {'user': g.user}
    except AttributeError:
        return {'user': None}

Вспоминаем сеансы

Сессия пользователя может быть запомнена, если она указана при входе в систему. Обычная реализация этой возможности заключается в передаче параметра из формы входа (remember_me, keep и т.д.), чтобы отметить действие. Flask-Login пометит сессию как постоянную, если ему об этом сообщить.

python-social-auth по умолчанию проверяет наличие заданного имени (keep), но поскольку провайдеры не передают параметры обратно в приложение, значение должно быть сохранено в сессии до начала процесса аутентификации.

Итак, для того, чтобы это работало, необходимы следующие настройки:

SOCIAL_AUTH_FIELDS_STORED_IN_SESSION = ['keep']

Можно переопределить имя по умолчанию с помощью этого параметра:

SOCIAL_AUTH_REMEMBER_SESSION_NAME = 'remember_me'

Не используйте значение remember, так как это будет противоречить Flask-Login, который извлекает значение из сессии.

Затем просто передайте параметр keep=1 в качестве параметра GET или POST.

Обработка исключений

The Django application has a middleware (that fits in the framework architecture) to facilitate the different exceptions handling raised by python-social-auth. The same can be accomplished (even in a simple way) in Flask by defining an errorhandler. For example the next code will redirect any social-auth exception to a /socialerror URL:

from social_core.exceptions import SocialAuthBaseException


@app.errorhandler(500)
def error_handler(error):
    if isinstance(error, SocialAuthBaseException):
        return redirect('/socialerror')

Обязательно установите флаги debug и test в False при тестировании в среде разработки, иначе будет вызвано исключение и обработчики ошибок не будут вызваны.

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