【发布时间】:2020-10-13 19:44:43
【问题描述】:
我正在构建一个执行 API 请求的 kivy 应用程序。
get_token() 函数在启动应用程序时首先运行以获取所有必要的信息、字典、变量等。在令牌过期 30 分钟后,应用程序有一个按钮,on_press 它将向服务器发送请求调用,如果令牌过期它不会工作。我正在尝试构建一个装饰器@use_token,它将检查简单请求是否被执行并接收响应 200 成功代码,如果成功:返回(装饰函数)否则:调用 get_token 将刷新令牌,并返回装饰函数。整个概念有效,打印在每个函数中每个可能的代码块上工作,但是当 30 分钟令牌过期后,refresh_token() 在 if 语句中调用 get_token(),打印仍然有效,但返回的修饰函数不发送请求,它打印测试字符串但不做主要的事情。这告诉我函数 get_token() 在 if 语句中执行但不更新令牌信息...
第一个函数,在开始时运行一个:
def get_token():
url_token = "http://server.com"
payload = "{" \
"\n \"grantType\": \"password\"," \
"\n \"password\": \"string\"," \
"\n \"refreshToken\": \"string\"," \
"\n \"token\": \"string\"," \
"\n \"username\": \"admin\"" \
"\n}"
headers = {
'Content-Type': 'application/json',
'api_key': ''
}
global readyToken
readyToken = requests.request("POST", url_token, headers=headers, data=payload).json()['token']
print("Getting a NEW TOKEN!")
get_token()
装饰功能:
def use_token(func):
@functools.wraps(func)
def refresh_token(*args):
url_check = "simplerequest.com"
response = requests.request("PUT", url_check, headers=HEADERS)
print("This print from url_check block "+str(response))
str_response = str(response)
if '401' in str_response:
print("401 found, Token is Expired, refreshing with get_token")
get_token()
else:
print("200 Code, success, passing, leaving else statement")
pass
print("emptying str_response and calling for decorated function:")
str_response = ""
return func(*args)
return refresh_token
装饰功能:
global URL_QC, HEADERS
URL_QC = "www.server.com"
HEADERS = {
'Content-Type': 'application/json',
'api_key': readyToken
}
@use_token
def change_channel(self, display_mac, ch_number):
print("Hello from DECORATED function!!!")
payload = "{\"deviceIds\": [" + str(display_mac) + "],\"menu\": \"save_sch_channel\", \"productType\": \"string\", \"value\":" + str(ch_number) + "}"
response = requests.request("PUT", URL_QC, headers=HEADERS, data=payload)
【问题讨论】:
标签: python authentication kivy token decorator