如何使用flask-security在登录时运行自定义代码

时间:2014-08-04 08:24:09

标签: python flask flask-security

我是新手,但对python有一定的精通 - 我有一个烧瓶应用程序,它使用flask-security进行用户身份验证。我想为用户登录过程添加一些额外的功能。具体来说,我需要在登录时将用户的auth_token(我将其设置为一次性使用令牌)保存到数据库,并在注销时将其删除。问题来了,因为烧瓶安全性(据我所知)没有直接向开发人员公开登录的机制。据我所知,它从代码中导入了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
然而,我遇到了各种各样的命名空间问题,这似乎是一种非常丑陋的方式。

我当时觉得可能有一种方法可以用装饰器做到这一点,但我是新手,并且没有使用装饰器。

关于最佳方法可能是什么的任何想法?对于上下文,我想要db中的auth_token,因为我需要将网站身份验证传递给另一个进程,该进程也访问数据库。另一个过程是使用websockets的API服务器。我不想把这些过程结合起来。

2 个答案:

答案 0 :(得分:6)

我认为使用信号装饰器似乎是最简单的 - 在以下示例中,当用户登录到您的应用时,应调用on_user_logged_in。更多信息in the docs

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.

答案 1 :(得分:0)

最好保持干净,编写自己的new_login_user函数,并在每次使用flask.ext.login.login_user时使用它。您可以将new_login_user放入自己的文件中并从那里导入。

您甚至可以将其称为login_user,而不是直接导入flask.ext.login.login_user