从Python

时间:2017-09-03 21:23:03

标签: python simplehttpserver

我正在编写一个授权访问ETrade API的课程。 (理论上,这实际上可以使用任何使用OAuth 1.0的API。)可以找到完整的代码in my GitHub。我的问题的相关代码如下:

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中运行时,它会在控制台中解析,我可以点击它。此网址将加载用户登录其帐户的页面,并授权我的应用获取访问权限。结果作为对http://localhost的回复返回。这就是为什么我启动一个HTTPServer实例来监听带有验证令牌的请求。

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

1 个答案:

答案 0 :(得分:0)

您可以使用import select.poll()来检查套接字对象是否处于活动状态。

然后您可以使用webbrowser打开URl: https://docs.python.org/2/library/webbrowser.html#module-webbrowser

webbrowser.open_new_tab(self.get_authorization_url())