有人知道关于 flask 原理的好教程吗?我正在尝试进行身份验证和授权(needRole 和 needIdentity),但我没有得到任何结果。
我几乎可以肯定没有真正全面的教程 - 也许你们中的一些人有一些时间并想发布一个教程作为答案?我真的决定使用 flask 而不是 django 但需要解决这个问题。
最佳答案
我知道这个问题有点老了,但几天前我一直在寻找同样的东西,所以希望这对 future 的人有所帮助。 . .
一个好的起点是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:当这个信号被调用时,我们知道要更新用户的身份。 (当它被称为 executes 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_call 会执行。希望 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 链接的源代码;这可能是了解正在发生的事情的最佳方式。
关于python - Flask-principal 教程(auth + auth),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7050137/
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的
本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决
1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,
在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主