如何在python flask应用程序中外部化装饰器

问题描述 投票:0回答:1

我写了一个python Flask应用程序,它具有如下的类和方法。

class PythonSample:
    def method1():
        pass # does something

    def method2():
        pass # does something

现在我写了另一个具有装饰器功能的类,如下。

class PythonAuth:
    def oauthAuth():
        pass

现在我为下面的PythonSample类的所有方法连接oauthAuth装饰器

import oauthAuth from PythonAuth

class PythonSample
    @oauthAuth
    def method1():
        pass # does something

    @oauthAuth
    def method2():
        pass # does something

在每种方法上应用装饰器都可以正常工作。

问题:而不是将oauthAuth装饰器应用于每个方法。有没有一种方法可以在python中进行配置,因为将oauthAuth装饰器应用于类中的所有方法并排除某些方法。

类似于某些URL包含身份验证,而某些URL不包含身份验证

请在这里忽略python代码的语法。

python authentication oauth python-decorators externalizing
1个回答
0
投票

您可以使用类装饰器和一些魔术。

装饰功能

假设您有一个装饰器,该装饰器在调用该函数之前仅记录一个字符串。

def log(func):
    def logged_func(*args, **kwargs):
            print('logged')
            func(*args, **kwargs)
    return logged_func

装饰类

您可以使用相同的技巧,但要使用一个类。 log_all是类装饰器,cls是类类型。我们使用vars浏览类字典,并使用callable(v)查找方法。用log(v)装饰该方法,然后使用setattrcls定义更改为新的修饰方法。就像函数装饰器一样,最后返回类。

def log_all(cls):
    for k, v in vars(cls).items():
            if callable(v):
                    setattr(cls, k, log(v))
    return cls

我本质上忽略了k,但是k是方法名称,您可以利用它来实现您的使用场景。

完整代码

这里是一个完整的例子,现在应该有意义。

def log(func):
    def logged_func(*args, **kwargs):
            print('logged')
            func(*args, **kwargs)
    return logged_func

def log_all(cls):
    for k, v in vars(cls).items():
            if callable(v):
                    setattr(cls, k, log(v))
    return cls

@log_all
class A:
    def method(self):
            pass

A类中的每个方法都应使用log装饰器进行装饰。

>>> a = A()
>>> a.method()
logged
© www.soinside.com 2019 - 2024. All rights reserved.