有人知道关于flask-principal的好教程吗?我试图进行身份验证和授权(needRole和needIdentity),但我还没有到达任何地方。
我几乎肯定没有真正全面的教程 - 也许你们中的一些人有一些时间在他们手上,并希望发布一个教程作为答案?我真的决心用烧瓶代替django,但需要解决这个问题。
答案 0 :(得分:49)
我知道这个问题有点陈旧,但几天前我一直在寻找同样的事情,所以希望这将有助于未来的某些人。 。 。
一个好的起点是the github repo for Flask-Principal。
我也遇到过Flask-Principal(FP)的问题。如果您是decorators,context-managers和signals的新手,您可能希望在使用FP之前稍微研究一下。
Flask根据名为Blinker的包注册信号。如果您没有Blinker,Flask仍会允许您声明信号,但不会做任何事情。要了解我的意思,请查看Flask signals.py的来源。
那为什么这对FP来说很重要?好吧,事实证明FP使用信号来注册和更新身份。具体做法是:
identity_loaded
:当调用此信号时,我们知道为用户创建一个标识对象。 (这是通过Principal._set_thread_identity()
称为)
identity_changed
:调用此信号时,我们知道更新用户的身份。 (当它被称为执行 Principal._on_identity_changed()
)
那么被称为是什么意思?首先,我们需要知道如何设置信号。 Blinker通过允许函数“订阅”信号来工作。因此,例如,Principal._on_identity_changed()
被设置为信号identity_changed
的订阅者。每当发送信号identity_changed
时,都会执行_on_identity_changed()。代码如下所示:
from blinker import signal
test = signal('test')
test.connect(func_we_want_to_execute_when_signal_is_called)
回到如何调用信号的问题。在Blinker中,当我们在信号对象上调用send()
时,将执行信号处理程序。因此,对于我们的test
信号,语法只是:
test.send()
调用test.send()
时func_we_want_to_execute_when_signal_is_called
将执行。希望FP文档中的这个例子现在更有意义了:
def login_view(req):
username = req.form.get('username')
# Your authentication here.
# Notice our signal (identity_changed) is being called (identity_changed.send())
# What function is being called? Principal._on_identity_changed()
identity_changed.send(app, identity=Identity(username))
但是,如果我们使用装饰器为我们做这件事,我们可以简化设置信号。再次假装我已经设置了我的测试信号但没有连接它。我们可以这样做:
@test.connect
def func_we_want_to_execute_when_signal_is_called():
return stuff
上述代码的作用实质上是设置我们在发送测试信号时要执行的功能。希望现在FP文档中的以下代码是有道理的:
# We're setting up our signal (identity_loaded)
# to execute the function below (on_identity_loaded)
# when we call our signal (identity_loaded.send())
# which is called in Principal._set_thread_identity()
@identity_loaded.connect
def on_identity_loaded(sender, identity):
# Get the user information from the db
user = db.get(identity.name)
# Update the roles that a user can provide
for role in user.roles:
identity.provides.add(RoleNeed(role.name))
# Save the user somewhere so we only look it up once
identity.user = user
所以你可以看到信号确实推动了身份认同过程。如果您正在寻找任何形式的授权方式,角色和权限实际上是(更容易)事后的想法。
对我来说,把信息包裹在信号周围是最困难的部分;我希望这对其他人也有帮助。但我真的很鼓励你仔细阅读我上面为Flask-Principal链接的源代码;它可能是理解正在发生的事情的最佳方式。
答案 1 :(得分:6)
那里唯一一个似乎是this blog post。
web site of the project是一个(非常简短的)教程,后面是完整的API文档。你的问题表明你已经看过了。
您可能也对提供会话管理的flask-login感兴趣,并在链接的博客文章中也有介绍。
这里的任何人都不太可能有这方面的经验(以及分享细节的时间),但我只是为了一个教程作为答案。
答案 2 :(得分:5)
出于某种原因,烧瓶原理的例子非常少。我个人发现Flask-Principal文档一开始就很神秘。一旦我浏览了源代码,一切似乎都更好地适应了。
受到我能够找到的这两个链接here和here的启发,我使用flask-login,flask-principals和blueprints将一个简单的例子放在一起
https://github.com/shankararul/flask-login-principal
我尽力在这里解释这篇文章。如果您有任何反馈,请告诉我,我可以修改/更新帖子
https://medium.com/@shankararul/a-shot-at-demystifying-flask-principal-dda5aaeb6bc6