0

这里是一个完整的python新手,所以不要对我大喊大叫: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 通信的其他函数,然后我必须用这个检查来膨胀它们中的每一个。

也许支票可以做成一个函数(我不知道怎么做)?

谢谢!

PS 将来我计划将这些功能移动到另一个文件中,然后将它们导入。我对这部分也有一些问题,但我稍后会发布一个新问题:)

4

1 回答 1

0

一个可能的解决方案可以简化该过程,尽管它最终不能完全回答您的具体问题,但可以利用您知道会话持续约 6 小时这一事实。将您在通话中登录的时间login(api_key)与会话字符串一起存储,如果当前时间距该时间超过 6 小时,请立即自动重新登录。

将其作为检查包含在您的 load_session 函数调用中可能会很好。

如果会话时间是可变的,则只需较短的时间长度即可确保在会话到期之前更新会话。

于 2013-09-14T23:00:33.633 回答