gpt4 book ai didi

python - 帮助使用 python (pylons) 中的授权和重定向装饰器

转载 作者:太空宇宙 更新时间:2023-11-04 09:20:58 25 4
gpt4 key购买 nike

我正在尝试编写一个简单的装饰器来检查用户的身份验证,并在他/她未通过身份验证时重定向到登录页面:

def authenticate(f):
try:
if user['authenticated'] is True:
return f
except:
redirect_to(controller='login', action='index')

class IndexController(BaseController):
@authenticate
def index(self):
return render('/index.mako' )

但是这种方法行不通。当用户通过身份验证时,一切都很好。但是当用户未通过身份验证时,redirect_to() 不起作用,我收到此错误:

HTTPFound: 302 Found Content-Type: text/html; charset=UTF-8 Content-Length: 0 location: /login

感谢您的帮助!

最佳答案

我不知道 Pylons ,但看起来你写装饰器的方式不太好。

装饰器是一个可调用对象,它必须返回一个可调用对象。装饰器在函数被定义的那一刻被调用,它应该返回一个可调用的(通常是一个函数),它将被调用来代替被装饰的函数。

在您的示例中,您的装饰器仅在用户通过身份验证时才返回可调用对象在定义 index() 函数时

尝试这样重写它:

def authenticate(func):
def call(*args, **kwargs):
if user['authenticated'] is True:
return func(*args,**kwargs)
else:
return redirect_to(controller='login', action='index')
return call

这里,authenticate() 定义了一个内部函数,它被返回来代替它修饰的函数。现在当你使用这个装饰器装饰一个函数时:

@authenticate
def index(self):
return render('/index.mako' )

这意味着每次调用 index() 时,您实际上是在调用装饰器中声明的内部函数。

你应该注意:由于在python中定义函数的方式,装饰器返回的函数对象仍然会记住定义它的函数的参数值。 call() 仍然知道调用装饰器时传递的参数 func。 (这称为闭包)

装饰器虽然不复杂,但很难理解。您应该在 google 上搜索有关装饰器的教程:其中有很多可以很好地理解这个概念,比 python 文档要清晰得多。

关于python - 帮助使用 python (pylons) 中的授权和重定向装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2724057/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com