Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何序列化OAuth1Session?_Python_Oauth - Fatal编程技术网

Python 如何序列化OAuth1Session?

Python 如何序列化OAuth1Session?,python,oauth,Python,Oauth,我目前有一个单片Python脚本,它执行OAuth身份验证,返回一个OAuth1Session,然后继续使用该OAuth1Session执行一些业务逻辑,以获得对第三方服务的授权 我需要将其分为两个单独的脚本,一个执行OAuth身份验证并将在一台机器上运行,另一个将在远程机器上运行以执行针对第三方服务授权的业务逻辑 如何序列化OAuth1Session对象,以便将经过身份验证的令牌从机器A上的身份验证脚本无缝地传递到机器B上的处理脚本 我尝试了显而易见的方法: print(json.dumps(

我目前有一个单片Python脚本,它执行OAuth身份验证,返回一个
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获得了
。我会附上完整的代码。是的,但是怎么做?你刚才用不同的词重复了我的问题我编辑了你的答案。
签名
服务
参数导致了错误,但当我删除它们时,这会起作用!谢谢你带路。