用装饰器进行Python客户端认证

2024-03-29 06:39:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在restapi之上构建一个python客户机,restapi使用API\u令牌进行身份验证。因此,所有api调用都需要api\u令牌。因为添加一个字段是很难看的

'token=...'

例如

a = f1(5, token='token')
b = f2(6, 12, token='token')
c = f3(2, 'a', token='token')

其中f1和f2内部委托给restapi

到每个函数调用。我想要的是:

auth = authenticate('token')

a = f1(5)
b = f2(6, 12,)
c = f3(2, 'a')

我能做的就是创建一个类并使所有函数成为成员函数。因此,我们将:

auth = calculator('token')
a = auth.f1(5)
b = auth.f2(6, 12,)
c = auth.f3(2, 'a')

但这也有点难看。我正试图让这个工作与装饰,但到目前为止没有任何效果。你知道吗

class authenticate:
   def __init__(self, token):
       self.token = token

   def __call__(self, func):
       def functor(*args, **kwargs):
           return func(*args, **kwargs, key=self.authentication)
       return functor 

@authenticate
def f1(a, key):
    data = a
    result = requests.get(1, data, key)
    return result

然而,这似乎是行不通的。我还想知道,如果在导入时执行decorator,并且在运行时添加令牌,那么这是否会起作用。你知道吗

关于如何使这项工作或任何人知道,如果有另一个标准模式,这方面的建议?你知道吗


Tags: key函数selftokenauthapirestapireturn
1条回答
网友
1楼 · 发布于 2024-03-29 06:39:47

所以经过一番黑客攻击,我们得出了以下结论:

class authenticate:
   # start empty key
   key = None

   @classmethod
   """ add the token """
   def set_key(cls, token):
       cls.token = token

   def __init__(self, func=None):
       if func is not None:
           self.func = func
       else:
           print('no function')

   def __call__(self, *arg):
       """
       add authentication to function func
       """
       ret = self.func(*arg, auth_key=self.key)
       return ret

@authenticate
def f1(a, key):
    data = a
    result = requests.get(1, data, key)
    return result

然后可以运行如下代码:

authentication_key = 'token'

print('Initiate class')
authenticate().set_key(key=authentication_key)

print('Run f1(5)')
a1 = f1(5) # no token needed!
a2 = f2(6, 12) # again no token needed as it is in the decorator
print(a1)

这或多或少像我希望的那样工作,我发现它比类方法更干净。如果有人有更好的建议或改进让我知道。你知道吗

相关问题 更多 >