如何序列化 OAuth1Session?
How to serialize an OAuth1Session?
我目前有一个单一的 Python 脚本,它执行 OAuth 身份验证,返回 OAuth1Session
,然后使用该 OAuth1Session
继续执行一些业务逻辑以获得对第三方服务。
我需要将它分成两个单独的脚本,一个执行 OAuth 身份验证并将 运行 在一台机器上,另一个将 运行 在远程机器上执行针对第三方服务授权的业务逻辑。
如何序列化 OAuth1Session
对象,以便可以将经过身份验证的令牌从机器 A
上的 身份验证脚本 无缝传递到 在机器上处理脚本 B
?
我尝试了显而易见的方法:
print(json.dumps(session))
但是我得到了这个错误:
TypeError: Object of type OAuth1Session is not JSON serializable
这个简单的需求有规范的解决方案吗?
更新
这是完整的源代码。请注意这不是我的代码,我是从作者那里下载的,现在我正在尝试修改它以使其工作方式有所不同。
"""This Python script provides examples on using the E*TRADE API endpoints"""
from __future__ import print_function
import webbrowser
import json
import logging
import configparser
import sys
import requests
from rauth import OAuth1Service
def oauth():
"""Allows user authorization for the sample application with OAuth 1"""
etrade = OAuth1Service(
name="etrade",
consumer_key=config["DEFAULT"]["CONSUMER_KEY"],
consumer_secret=config["DEFAULT"]["CONSUMER_SECRET"],
request_token_url="https://api.etrade.com/oauth/request_token",
access_token_url="https://api.etrade.com/oauth/access_token",
authorize_url="https://us.etrade.com/e/t/etws/authorize?key={}&token={}",
base_url="https://api.etrade.com")
base_url = config["DEFAULT"]["PROD_BASE_URL"]
# Step 1: Get OAuth 1 request token and secret
request_token, request_token_secret = etrade.get_request_token(
params={"oauth_callback": "oob", "format": "json"})
# Step 2: Go through the authentication flow. Login to E*TRADE.
# After you login, the page will provide a text code to enter.
authorize_url = etrade.authorize_url.format(etrade.consumer_key, request_token)
webbrowser.open(authorize_url)
text_code = input("Please accept agreement and enter text code from browser: ")
# Step 3: Exchange the authorized request token for an authenticated OAuth 1 session
session = etrade.get_auth_session(request_token,
request_token_secret,
params={"oauth_verifier": text_code})
return(session, base_url)
# loading configuration file
config = configparser.ConfigParser()
config.read(sys.argv[1])
(session, base_url) = oauth()
print(base_url)
print(json.dumps(session))
#original code
#market = Market(session, base_url)
#quotes = market.quotes(sys.argv[2])
请注意最后两行注释掉的行。那是原始代码:在执行 oauth 之后,代码立即调用一些业务功能。我想将其分解为两个单独的脚本 运行ning 作为隔离进程:脚本 1 执行 oauth 并保留会话,脚本 2 从文件中读取会话并执行业务功能。
不幸的是它在最后一行失败了,print(json.dumps(session))
。
"XY Problem" 警报
我的目标是将脚本分成两部分,以便业务逻辑可以 运行 在与身份验证代码不同的机器中。我相信这样做的方法是序列化 session
对象,然后在第二个脚本中将其解析回来。使用 json.dumps()
打印会话是 中间步骤,'Y',在我解决 问题 'X'[=59] 的过程中=].如果您能想到更好的方法来实现目标,那可能是一个有效的答案。
来自此处源代码中可用的注释:https://github.com/litl/rauth/blob/a6d887d7737cf21ec896a8104f25c2754c694011/rauth/session.py
你只需要序列化你的对象的一些属性来重新实例化它:
Line 103
def __init__(self,
consumer_key,
consumer_secret,
access_token=None,
access_token_secret=None,
signature=None,
service=None):
...
因此我建议在第一台机器上序列化以下字典:
info_to_serialize = {
'consumer_key': session.consumer_key,
'consumer_secret': session.consumer_secret,
'access_token': session.access_token,
'access_token_secret': session.access_token_secret
}
serialized_data = json.dumps(info_to_serialize)
然后在第二台机器上重新实例化您的会话:
from rauth.session import OAuth1Session
info_deserialized = json.loads(serialized_data)
session = OAuth1Session(**info_deserialized)
希望对您有所帮助
我目前有一个单一的 Python 脚本,它执行 OAuth 身份验证,返回 OAuth1Session
,然后使用该 OAuth1Session
继续执行一些业务逻辑以获得对第三方服务。
我需要将它分成两个单独的脚本,一个执行 OAuth 身份验证并将 运行 在一台机器上,另一个将 运行 在远程机器上执行针对第三方服务授权的业务逻辑。
如何序列化 OAuth1Session
对象,以便可以将经过身份验证的令牌从机器 A
上的 身份验证脚本 无缝传递到 在机器上处理脚本 B
?
我尝试了显而易见的方法:
print(json.dumps(session))
但是我得到了这个错误:
TypeError: Object of type OAuth1Session is not JSON serializable
这个简单的需求有规范的解决方案吗?
更新
这是完整的源代码。请注意这不是我的代码,我是从作者那里下载的,现在我正在尝试修改它以使其工作方式有所不同。
"""This Python script provides examples on using the E*TRADE API endpoints"""
from __future__ import print_function
import webbrowser
import json
import logging
import configparser
import sys
import requests
from rauth import OAuth1Service
def oauth():
"""Allows user authorization for the sample application with OAuth 1"""
etrade = OAuth1Service(
name="etrade",
consumer_key=config["DEFAULT"]["CONSUMER_KEY"],
consumer_secret=config["DEFAULT"]["CONSUMER_SECRET"],
request_token_url="https://api.etrade.com/oauth/request_token",
access_token_url="https://api.etrade.com/oauth/access_token",
authorize_url="https://us.etrade.com/e/t/etws/authorize?key={}&token={}",
base_url="https://api.etrade.com")
base_url = config["DEFAULT"]["PROD_BASE_URL"]
# Step 1: Get OAuth 1 request token and secret
request_token, request_token_secret = etrade.get_request_token(
params={"oauth_callback": "oob", "format": "json"})
# Step 2: Go through the authentication flow. Login to E*TRADE.
# After you login, the page will provide a text code to enter.
authorize_url = etrade.authorize_url.format(etrade.consumer_key, request_token)
webbrowser.open(authorize_url)
text_code = input("Please accept agreement and enter text code from browser: ")
# Step 3: Exchange the authorized request token for an authenticated OAuth 1 session
session = etrade.get_auth_session(request_token,
request_token_secret,
params={"oauth_verifier": text_code})
return(session, base_url)
# loading configuration file
config = configparser.ConfigParser()
config.read(sys.argv[1])
(session, base_url) = oauth()
print(base_url)
print(json.dumps(session))
#original code
#market = Market(session, base_url)
#quotes = market.quotes(sys.argv[2])
请注意最后两行注释掉的行。那是原始代码:在执行 oauth 之后,代码立即调用一些业务功能。我想将其分解为两个单独的脚本 运行ning 作为隔离进程:脚本 1 执行 oauth 并保留会话,脚本 2 从文件中读取会话并执行业务功能。
不幸的是它在最后一行失败了,print(json.dumps(session))
。
"XY Problem" 警报
我的目标是将脚本分成两部分,以便业务逻辑可以 运行 在与身份验证代码不同的机器中。我相信这样做的方法是序列化 session
对象,然后在第二个脚本中将其解析回来。使用 json.dumps()
打印会话是 中间步骤,'Y',在我解决 问题 'X'[=59] 的过程中=].如果您能想到更好的方法来实现目标,那可能是一个有效的答案。
来自此处源代码中可用的注释:https://github.com/litl/rauth/blob/a6d887d7737cf21ec896a8104f25c2754c694011/rauth/session.py
你只需要序列化你的对象的一些属性来重新实例化它:
Line 103
def __init__(self,
consumer_key,
consumer_secret,
access_token=None,
access_token_secret=None,
signature=None,
service=None):
...
因此我建议在第一台机器上序列化以下字典:
info_to_serialize = {
'consumer_key': session.consumer_key,
'consumer_secret': session.consumer_secret,
'access_token': session.access_token,
'access_token_secret': session.access_token_secret
}
serialized_data = json.dumps(info_to_serialize)
然后在第二台机器上重新实例化您的会话:
from rauth.session import OAuth1Session
info_deserialized = json.loads(serialized_data)
session = OAuth1Session(**info_deserialized)
希望对您有所帮助