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
при тестировании в среде разработки, иначе будет вызвано исключение и обработчики ошибок не будут вызваны.