8

我是烧瓶的新手,但对 python 有一定的了解——我有一个烧瓶应用程序,它使用烧瓶安全性进行用户身份验证。我想在用户登录过程中添加一些额外的功能。具体来说,我需要在用户登录时将用户的 auth_token(我设置为一次性令牌)保存到数据库,并在他们注销时将其删除。问题的出现是因为flask-security 没有(据我所知)将登录机制直接暴露给开发人员。据我从代码中可以看出,它导入了使用 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

然而,我遇到了各种各样的命名空间问题,这似乎是一种非常丑陋的方法。

我在想可能有一种方法可以使用装饰器,但我是烧瓶的新手,无论如何都没有使用过装饰器。

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

4

2 回答 2

6

我认为使用信号装饰器似乎是最简单的——在下面的示例中,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.
于 2014-08-04T14:31:19.013 回答
0

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

你甚至可以调用它login_user,并且永远不要直接导入flask.ext.login.login_user

于 2014-08-04T08:39:33.763 回答