我正在为管理信息中心实施“登录身份”功能。
基本上我很乐意让我们的管理员查看和使用网站,就好像她已经以特定客户身份登录一样。例如,如果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'
。
为此设置上下文:
我了解login_user
希望看到User
对象扩展stormpath.resource.Account
,而我们收到的account
对象没有定义is_active
。
如果我发送login_user
User
方法返回的stormpath_account = StormpathUser.create(...)
对象,我的应用程序其他部分的代码工作正常。
我也知道我正在将stormpath-flask
与原始stormpath-python-sdk
混合使用,我想我确实应该使用stormpath-flask
方法。
我可以看到使用Account.email
,我可以使用User
创建一个User.from_login
对象,但这不起作用,因为我们不会在我们的末尾存储密码。
我想知道有什么方法可以将Account
方法返回search
并将其转换为User
吗?你会怎么做才能使这个工作?
谢谢,
亚历
答案 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
希望有所帮助!