(Как) я могу отправить (подготовленные) запросы с запросами.OAuth2Session?
При запуске следующего (при замене example.com
с нашим API, очевидно)
req = Request('GET', 'https://example.com')
# client is a customized OAuth2Session
client.authorize(self.username, self.password, self.auth_key)
print(self.client.authorized) # True
следующие возвращения <Response [200]>
:
response = client.request(req.method, req.url)
Но это возвращается <Response [401]>
:
prepped = client.prepare_request(req)
response = client.send(prepped)
Как я могу использовать оригинал Request
объект при отправке через OAuth2Session
?
1 ответ
OAuth2Session
реализация не отменяет Session.prepare_request()
или же Session.send()
только методы Session.request()
был специализированным. Это потому, что он обрабатывает автообновление тем же способом, требуя отправки большего количества запросов.
Чтобы поддержать изменение этих запросов, библиотека предлагает средство перехвата соответствия, где в определенных точках процесса вызывается перехватчик, который может изменять детали запроса. Объект OAuth2Session, начиная с версии 0.4.0, поддерживает 3 различных перехвата:
access_token_response
: передал ответ от запроса токена доступа, прежде чем ответ будет проанализирован для извлечения токена.refresh_token_response
: передал ответ от запроса на обновление токена, еще раз, прежде чем ответ будет проанализирован.protected_request
: передал URL, заголовки и тело запросов, используемых для доступа к защищенным ресурсам (таким образом, запрос должен содержать действительный токен).
Некоторые из них включали средства проверки соответствия, которые используют эти ловушки для добавления отсутствующих элементов в ответах определенных поставщиков и для обновления исходящих запросов, когда определенные API-интерфейсы отклоняются от стандарта OAuth в отношении того, как они обрабатывают токены.
protected_request
интересный хук здесь, поскольку передаются те же данные, которые вы обычно хотели бы изменить при использовании request.Request()
/ session.prepare_request()
/ session.send()
шаблон. Вы можете изменить одни и те же данные запроса в несколько другой упаковке, прежде чем клиент oauthlib сможет добавить токен к этим данным.
Тем не менее, если вам не нужно использовать автообновление или вы можете самостоятельно справиться с истечением срока действия токена, вы можете получить доступ к oauthlib
клиент, который OAuth2Sesson
обертывания, напрямую. Если вы уже получили токен, вы можете подписать свой запрос перед подготовкой с помощью:
from oauthlib.oauth2 import TokenExpiredError
req = Request('GET', 'https://example.com')
try:
req.url, req.headers, req.data = client._client.add_token(
req.url, http_method=req.method, body=req.data, headers=req.headers
)
except TokenExpiredError:
# handle token expiration
pass
else:
prepped = client.prepare_request(req)
response = client.send(prepped)
Это использует клиента oauthlib add_token()
метод напрямую.