Как запустить пользовательский код при входе в систему с помощью 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
напрямую.