如何使用`stormpath-flask`

时间:2016-05-25 23:07:57

标签: python flask stormpath

我正在为管理信息中心实施“登录身份”功能。

基本上我很乐意让我们的管理员查看和使用网站,就好像她已经以特定客户身份登录一样。例如,如果Trish打电话给我们并提出问题,我们的管理员应该能够以Trish身份登录并查看Trish所看到的内容。

以下是我编写的代码,假设我们有一个有效的email

from app import stormpath_manager
from flask.ext.stormpath import login_user
... 
main_cloud_directory = stormpath_manager.client.directories.search({
    'name': 'Directory Name'})[0]
accounts = main_cloud_directory.accounts.search({'email': email})
if accounts.size == 1:
    account = accounts[0]
    login_user(account, remember=False)
    return redirect('/settings')
else:
    abort(404)

当我运行代码时,我得到了AttributeError: Account has no attribute 'is_active'

为此设置上下文:

  1. 我了解login_user希望看到User对象扩展stormpath.resource.Account,而我们收到的account对象没有定义is_active

  2. 如果我发送login_user User方法返回的stormpath_account = StormpathUser.create(...)对象,我的应用程序其他部分的代码工作正常。

  3. 我也知道我正在将stormpath-flask与原始stormpath-python-sdk混合使用,我想我确实应该使用stormpath-flask方法。

  4. 我可以看到使用Account.email,我可以使用User创建一个User.from_login对象,但这不起作用,因为我们不会在我们的末尾存储密码。

  5. 我想知道有什么方法可以将Account方法返回search并将其转换为User吗?你会怎么做才能使这个工作?

    谢谢,

    亚历

1 个答案:

答案 0 :(得分:1)

我是这个图书馆的作者,所以想跳到这里=)

答案是肯定的:您确实可以将普通Account对象转换为有效的Flask-Stormpath User对象。方法如下:

from flask.ext.stormpath import login_user
from flask.ext.stormpath.models import User

from app import stormpath_manager


# ...


main_cloud_directory = stormpath_manager.client.directories.search({
    'name': 'Directory Name'
})[0]
accounts = main_cloud_directory.accounts.search({'email': email})

if accounts.size == 1:
    account = accounts[0]
    account.__class__ = User
    login_user(account, remember=False)

    return redirect('/settings')
else:
    abort(404)

重要的是account.__class__ = User。这使用了一些元魔法将类转换为User对象=)这也是我在库中幕后做的事情,例如:https://github.com/stormpath/stormpath-flask/blob/4185f2f41574156870ce1aa990d34e4ad84357be/flask_stormpath/models.py#L125-L126

希望有所帮助!