检查过期和更新auth会话(pythonic方式)

时间:2013-09-14 18:19:16

标签: python session

这里有一个完整的蟒蛇新手,所以不要对我大喊: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。将来我计划将函数移动到另一个文件,然后导入它们。我在这方面也有一些问题,但我稍后会发布一个新问题:)

1 个答案:

答案 0 :(得分:0)

一种简化流程的可能解决方案,虽然它最终没有完全回答您的具体问题,但是可以利用您知道会话持续约6小时的事实。使用login(api_key)电话和会话字符串存储您登录的时间,如果当前时间是>从那时起6个小时,立即自动重新登录。

在load_session函数调用中包含它作为一个检查可能会很好。

如果会话时间是可变的,那么只需要较短的时间就可以在会话到期之前更新会话。