2017-09-03 120 views
0

我在写一个授权访问ETrade API的类。 (理论上,这实际上可以与任何使用OAuth 1.0的API协同工作。)完整的代码可以在in my GitHub找到。相关的代码,以我的问题如下:从Python加载浏览器中的URL

base_url = 'https://etws.etrade.com' 


class Authorization: 
    def __init__(self): 
     self.oauth_session = requests_oauthlib.OAuth1Session(config.oauth_consumer_key, config.consumer_secret, 
                  callback_uri='oob') 
     self.oauth_url = base_url + "/oauth" 
     print(self.get_authorization_url()) 
     self.run_authorization_server() 

    // ... snip ... 

    def run_authorization_server(self): 
     host_name = 'localhost' 
     host_port = 80 
     with server.HTTPServer((host_name, host_port), AuthenticationCallbackHandler) as httpd: 
      httpd.serve_forever() 

正如你所看到的,我打印的授权URL,用户必须复制并粘贴到自己的浏览器。当我在IntelliJ IDEA中运行时,它在控制台中被解析,我可以点击它。此URL将加载用户登录其帐户并授权我的应用访问的页面。结果返回作为对http://localhost的回复。这就是为什么我启动一个HTTPServer实例来侦听带有验证令牌的请求。

这个过程并不理想。我想以编程方式加载授权URL。复杂的是,我需要确保我的本地服务器在加载授权之前启动。据我所知,server_forever()阻止当前线程。这表明我需要启动一个线程来启动服务器。我该怎么做呢?更重要的是,我如何知道服务器已启动,以便加载URL是安全的?最后,我如何在浏览器中实际加载URL?

回答