Как запустить пользовательский код при входе в систему с помощью flask-security

Я новичок в flask, но умеренно опытен в python - у меня есть приложение flask, которое использует flask-security для аутентификации пользователей. Я хотел бы добавить некоторые дополнительные функции в процесс входа пользователя. В частности, мне нужно сохранить auth_token пользователя (который я настроил как одноразовый токен) в БД при входе в систему и удалить его при выходе из системы. Проблема возникает потому, что flask-security не (Насколько мне известно) подвергает механизм входа в систему непосредственно разработчик. Насколько я могу судить по коду, он импортирует flask-login, который использует функцию login_user.

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

import flask.ext.login as a
def new_login_user():
    ...copy of existing function goes here...
    ...Plus new stuff with current_user.get_auth_token()...
a.login_user = new_login_user

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

Я думал там может быть способ сделать это с декоратором, но я я новичок в колбе, и не использовал декораторов много независимо.

есть идеи о том, как лучше всего подойти к этому? для контекста я хочу auth_token в БД, потому что мне нужно передать аутентификацию веб-сайта другому процессу, который также обращается к БД. Другой процесс-это сервер API с использованием websockets. Я не хочу комбинировать процессы.

2 ответов


Я думаю, что использование декоратора сигнала кажется самым простым - в следующем примере on_user_logged_in должен быть вызван, когда пользователь входит в приложение. Подробнее в документах.

from flask.ext.login import user_logged_in

@user_logged_in.connect_via(app)
def on_user_logged_in(sender, user):
    log_auth_token(user.get_auth_token()) # or whatever.

лучше держать его в чистоте, написать свой собственный new_login_user функция и использовать это всякий раз, когда вы в противном случае используете flask.ext.login.login_user. Вы могли бы положить свой new_login_user в свой собственный файл и импортировать его оттуда.

вы могли бы даже назвать его login_user, а не импортные flask.ext.login.login_user напрямую.