Как запустить собственный код при входе в систему с помощью Flask-Security

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

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

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

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

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

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


person domoarigato    schedule 04.08.2014    source источник


Ответы (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.
person Doobeh    schedule 04.08.2014
comment
работал угощение, это все еще идиома, с которой я привык. В других моих проектах Python я никогда не использовал декораторы, но Flask полон их ... Обратите внимание, документы @user_logged_in не находятся по указанной вами ссылке, они указывают на общие документы подписки на сигналы на основе декораторов для Flask в целом . Они были полезны, но те, которые используются для входа в систему flask, находятся здесь. (Я оставляю их для других!) Спасибо, Doobeh! - person domoarigato; 04.08.2014

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

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

person opatut    schedule 04.08.2014
comment
Дело в том, что я никогда не импортирую / не использую login_user напрямую, модуль flask-security импортирует flask-login, который, в свою очередь, его использует. Я не думаю, что смогу обойти это, сохранив при этом все остальные функции. Надеюсь, что это яснее .. - person domoarigato; 04.08.2014