【发布时间】:2013-04-20 22:13:57
【问题描述】:
我们使用 Rauth 连接到各种 OAuth 1 API。它适用于单个请求,但尝试对给定会话执行 2 个或更多请求会导致来自 API 的 401 未授权错误。
Twitter API 示例:
import requests
from rauth import OAuth1Service
from rauth import OAuth1Session
consumer_key = {the consumer key}
consumer_secret = {the consumer secret}
access_token = {the access token}
access_token_secret = {the access token secret}
oauth_service = OAuth1Service(consumer_key = consumer_key,
consumer_secret = consumer_secret)
oauth_session = oauth_service.get_session(token = (access_token, access_secret))
url = 'https://api.twitter.com/1.1/statuses/home_timeline.json'
params = {'include_rts': 'true'}
r = oauth_session.get(url, params=params) # THIS WORKS
r = oauth_session.get(url, params=params) # THIS RETURNS 401 ERROR
这在 Twitter 和 LinkedIn API 上都会发生。我们如何针对单个OAuth1Session 对象执行多个请求?
版本:
劳斯==0.5.4
请求==1.1.0
更新:
奇怪的是,如果不包含 params 参数,则可以发出多个请求 - 但是一旦包含 params,即使它是空字典,我们也会得到 401。
示例 1:
r = oauth_session.get(url) # THIS WORKS
r = oauth_session.get(url) # THIS WORKS
示例 2:
r = oauth_session.get(url, params={}) # THIS WORKS
r = oauth_session.get(url, params={}) # THIS RETURNS 401 ERROR
【问题讨论】:
-
在第一次和第二次调用
get之间发生了什么事吗?我刚刚尝试了Twitter example,它似乎工作正常。 -
@maxcountryman - 不,我完全按照示例所示调用它们。看看我的更新...
-
如果你得到一个新的会话实例会发生什么? (顺便说一句,如果您使用服务包装器,这会变得容易得多。)
-
我们可以为每个请求创建一个新会话,但这样做效率低下并且破坏了会话对象的全部意义,不是吗?至于服务包装器,每次都需要生成新的令牌——但我们存储和重用客户的令牌,所以我们没有使用服务包装器。
-
您可以使用服务包装器来吐出新的会话对象,如下所示:
my_service.get_session(tokens)这比每次使用Session对象要干净得多。但是,您应该能够重用会话实例,因此它可能是一个错误。也许在 GitHub 上开一张票会更好?