【问题标题】:How to externalize the decorator in python flask application如何在 python 烧瓶应用程序中外部化装饰器
【发布时间】:2019-10-02 07:25:44
【问题描述】:

我写了一个 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】:

    你可以使用类装饰器加上一些魔法。

    装饰功能

    假设你有一个装饰器,它在调用函数之前只记录一个字符串。

    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
    

    【讨论】:

      猜你喜欢
      • 2012-07-14
      • 2019-08-10
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 2020-10-11
      • 2018-02-17
      • 1970-01-01
      相关资源
      最近更新 更多