【问题标题】:How to use python decorators for session validation如何使用 python 装饰器进行会话验证
【发布时间】:2018-09-28 14:46:18
【问题描述】:

我有一些像这样的会话类

class Session:

def __init__(self,):
    self._token_response_dict = self.get_token_details(Session._token_payload, Session._token_headers)
    self.token = self._token_response_dict['access_token']
    self.token_valid_time = datetime.datetime.now() + datetime.timedelta(
        seconds=self._token_response_dict['expires_in'])
    self.token_type = self._token_response_dict['token_type']

def is_valid(self):
    return True if datetime.datetime.now() < self.token_valid_time else False

@staticmethod
def get_token_details(payload, headers):
    r = requests.post('http://webservice/token',
                      data=payload, headers=headers)
    return json.loads(r.json())

在调用某些函数之前,我必须检查会话是否有效。我使用 session 作为全局变量,如下所示。

def get_all_docs(client_id):

global session
if session.is_valid():
    headers = {
        'content-type': "application/json",
        'cache-control': "no-cache",
        'postman-token': "aff6cf56-dc63-ae16-762f-4637762733ce",
        'authorization': session.token_type + ' ' + session.token

    }
    payload = {
        'LastRefreshTime': datetime.datetime.now().strptime(os.environ['LastRefreshTime'], '%d-%m-%Y %H:%M:%S'),
        'ClientID': client_id
    }

    r = requests.get(Details.get_docs_url, params=payload, headers=headers)
    return json.loads(r.json())
else:
    session = Session()
    get_all_docs(client_id)

如何使用 python 装饰器执行此验证?

【问题讨论】:

  • 你试过了吗?你能告诉我们一些努力吗?
  • 我对装饰器的实现有非常基本的了解。我试过了,但没有得到想要的结果
  • 请展示您的尝试并说出您遇到的问题...

标签: python python-3.x design-patterns python-decorators


【解决方案1】:

如果我们继续使用session作为全局变量,装饰器可以是这样的:

from functools import wraps

def keep_session_valid(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        global session
        if not session.is_valid():
            session = Session()
        return func(*args, **kwargs)


@keep_session_valid
def get_all_docs(client_id):
    headers = {
        'content-type': "application/json",
        'cache-control': "no-cache",
        'postman-token': "aff6cf56-dc63-ae16-762f-4637762733ce",
        'authorization': session.token_type + ' ' + session.token

    }
    payload = {
        'LastRefreshTime': datetime.datetime.now().strptime(os.environ['LastRefreshTime'], '%d-%m-%Y %H:%M:%S'),
        'ClientID': client_id
    }

    r = requests.get(Details.get_docs_url, params=payload, headers=headers)
    return json.loads(r.json())

注意wraps 不是强制性的,但它允许保持修饰函数参数(名称、文档字符串)不变。你可以阅读更多关于它的信息here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-03
    • 2020-06-12
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多