如何使多个@wrap更小?



我对python的了解还不够多,所以我想在这里尝试一下。有没有办法使这些几乎相同的@wraps函数占用更少的空间?我总共有5条这样的代码,而100行代码却只需要5倍的内容,这听起来像是浪费。我最初是在某个网站上找到的,但我似乎再也找不到它了。

功能:

def a_required(func):
@wraps(func)
def decorated_view(*args, **kwargs):
if request.method in EXEMPT_METHODS:
return func(*args, **kwargs)
elif current_app.config.get('LOGIN_DISABLED'):
return func(*args, **kwargs)
elif not current_user.is_authenticated or not current_user["Keys"]["A"]:
return current_app.login_manager.unauthorized()
return func(*args, **kwargs)
return decorated_view
def b_required(func):
@wraps(func)
def decorated_view(*args, **kwargs):
if request.method in EXEMPT_METHODS:
return func(*args, **kwargs)
elif current_app.config.get('LOGIN_DISABLED'):
return func(*args, **kwargs)
elif not current_user.is_authenticated or not current_user["Keys"]["B"]:
return current_app.login_manager.unauthorized()
return func(*args, **kwargs)
return decorated_view

这是一个Flask网站,只有具有相应权限的用户才能访问。

您可以编写一个返回装饰器的函数,并像这样调用它:

def required(req):
def wrapper(func):
@wraps(func)
def decorated_view(*args, **kwargs):
# put your decorated_view code here
#  swapping out the hard coded `current_user["Keys"]["B"]`
#  for `current_user["Keys"][req]`
print("executing decorator with", req)
return func(*args, **kwargs)
return decorated_view
return wrapper
@required("B")
def foo():
print("inside foo function")

@required("A")
def bar():
print("inside bar function")

然后执行这些函数如下:

>>> foo()
executing decorator with B
inside foo function
>>> bar()
executing decorator with A
inside bar function

函数required返回一个动态装饰器,它根据我们传递给它的值req来改变它的行为。这样,decorated_view函数可以访问req的适当值,这取决于我们如何调用required(...)

try this:

def required(req):
def wrapper(func):
@wraps(func)
def decorated_view(*args, **kwargs):
if not current_user.is_authenticated or not current_user["Keys"][req]:
return current_app.login_manager.unauthorized()
return func(*args, **kwargs)
return decorated_view
return wrapper

@required("A")
def method1():
pass

@required("B")
def method2():
pass

相关内容

  • 没有找到相关文章

最新更新