这里有一个完整的蟒蛇新手,所以不要对我大喊:D
我正在与在线服务进行通信,并且出现了一些问题。 :)
该服务返回的错误是:{"error" : {"code" : 1, "message" : "Descriptive message."}}
这些会话持续了大约6个小时,所以我真的想要缓存我的会话并重复使用它,因为在那6个小时内我可以发出数百个请求,并且对每个请求都是粗鲁的。
所以这个脚本有效,但我不喜欢最后的大执行位。
import requests
session_file = 'session'
url = 'service.com/articles/get'
api_key = 'my_api_key_goes_here'
class MyException(Exception):
pass
def load_session(session_file):
f = open(session_file, 'r')
session = f.read()
f.close
return session
def make_post(session, parameters):
post_data = json.dumps({"jsonrpc":"2.0", "session_id":session, "params":parameters})
return post_data
def get_article(article_id):
session = load_session(session_file)
post_data = (session, article_id)
result = requests.post(url, post_data)
if 'error' in result:
raise MyException(result['error'])
else:
return result
for attempt in range(2):
try:
article = get_article(123)
print(article)
break
except MyException as e:
if e.args[0]['code'] == 1:
print('Session expired, renewing')
login(api_key) #login function omitted for clarity
#it also writes the session string to a file
else:
print(e) #something else happened (for example 'no such article')
break
else:
break
有没有办法更好地做到这一点?
可以在功能本身中移动检查和续订。最后的执行只是:
try:
article = get_article(123)
print(article)
except MyException as e:
print(e)
我的问题是我有一堆其他功能与api通信然后我将不得不用这个检查臃肿其中每一个。
也许检查可以变成一个函数(我无法弄清楚如何)?
谢谢!
P.S。将来我计划将函数移动到另一个文件,然后导入它们。我在这方面也有一些问题,但我稍后会发布一个新问题:)
答案 0 :(得分:0)
一种简化流程的可能解决方案,虽然它最终没有完全回答您的具体问题,但是可以利用您知道会话持续约6小时的事实。使用login(api_key)
电话和会话字符串存储您登录的时间,如果当前时间是>从那时起6个小时,立即自动重新登录。
在load_session函数调用中包含它作为一个检查可能会很好。
如果会话时间是可变的,那么只需要较短的时间就可以在会话到期之前更新会话。