如何让多个@wraps 更小?
How can I make multiple @wraps smaller?
我对 python 的了解还不够(还)不足以自己解决这个问题,所以这就是我想在这里尝试的原因。有什么方法可以让这些几乎相同的@wraps函数占用更少space?我总共有 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 网站,其页面只有拥有适当权限的用户才能访问。
你可以编写一个 returns 装饰器的函数,并像这样调用它:
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
returns 一个动态装饰器,它根据我们传递给它的值 req
改变其行为。这样,decorated_view
函数可以根据我们调用 required(...)
.
的方式访问 req
的适当值
试试这个:
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
我对 python 的了解还不够(还)不足以自己解决这个问题,所以这就是我想在这里尝试的原因。有什么方法可以让这些几乎相同的@wraps函数占用更少space?我总共有 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 网站,其页面只有拥有适当权限的用户才能访问。
你可以编写一个 returns 装饰器的函数,并像这样调用它:
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
returns 一个动态装饰器,它根据我们传递给它的值 req
改变其行为。这样,decorated_view
函数可以根据我们调用 required(...)
.
req
的适当值
试试这个:
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