Python 如何序列化OAuth1Session?
我目前有一个单片Python脚本,它执行OAuth身份验证,返回一个Python 如何序列化OAuth1Session?,python,oauth,Python,Oauth,我目前有一个单片Python脚本,它执行OAuth身份验证,返回一个OAuth1Session,然后继续使用该OAuth1Session执行一些业务逻辑,以获得对第三方服务的授权 我需要将其分为两个单独的脚本,一个执行OAuth身份验证并将在一台机器上运行,另一个将在远程机器上运行以执行针对第三方服务授权的业务逻辑 如何序列化OAuth1Session对象,以便将经过身份验证的令牌从机器A上的身份验证脚本无缝地传递到机器B上的处理脚本 我尝试了显而易见的方法: print(json.dumps(
OAuth1Session
,然后继续使用该OAuth1Session
执行一些业务逻辑,以获得对第三方服务的授权
我需要将其分为两个单独的脚本,一个执行OAuth身份验证并将在一台机器上运行,另一个将在远程机器上运行以执行针对第三方服务授权的业务逻辑
如何序列化OAuth1Session
对象,以便将经过身份验证的令牌从机器A
上的身份验证脚本无缝地传递到机器B
上的处理脚本
我尝试了显而易见的方法:
print(json.dumps(session))
但我有一个错误:
TypeError:OAuth1Session类型的对象不可JSON序列化
对于这个简单的需求有一个规范的解决方案吗
更新
这是完整的源代码。请注意,这不是我的代码,我是从作者那里下载的,现在我正试图修改它,使其工作方式有所不同
"""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之后,代码立即调用一些业务功能。我想将其分解为两个单独的脚本,作为独立的进程运行:脚本1执行oauth并持久化会话,脚本2从文件读取会话并执行业务功能
不幸的是,它在最后一行,print(json.dumps(session))
失败
“XY问题”警报
我的目标是将脚本分成两部分,以便业务逻辑可以在独立于身份验证代码的机器中运行。我认为实现这一点的方法是序列化
会话
对象,然后在第二个脚本中解析它。使用json.dumps()
打印会话是解决问题“X”过程中的中间步骤。如果你能想出一个更好的方法来实现这个目标,这可能是一个有效的答案 您可以将必要的数据(请求令牌、访问令牌)保存到文件中,下次需要该对象时,从文件中加载令牌并用它们初始化对象。源代码中的注释如下:
只需序列化对象的某些属性即可重新实例化:
Line 103
def __init__(self,
consumer_key,
consumer_secret,
access_token=None,
access_token_secret=None,
signature=None,
service=None):
...
因此,我建议在第一台机器上序列化以下dict:
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)
希望这有帮助我不太明白你的问题。它与?我从rauth import OAuth1Service获得了
。我会附上完整的代码。是的,但是怎么做?你刚才用不同的词重复了我的问题我编辑了你的答案。签名
和服务
参数导致了错误,但当我删除它们时,这会起作用!谢谢你带路。