2017-09-03 2 views
0

Ich schreibe eine Klasse, die den Zugriff auf die ETrade API autorisieren wird. (In der Theorie wird dies tatsächlich mit jeder API funktionieren, die OAuth 1.0 verwendet.) Der vollständige Code kann in my GitHub gefunden werden. Der entsprechende Code auf meine Frage folgt:Laden Sie eine URL in den Browser von Python

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() 

Wie Sie sehen können, habe ich die Berechtigung URL drucken und der Benutzer muss kopieren und in den Browser einfügen. Wenn ich in IntelliJ IDEA laufe, wird es in der Konsole geparst und ich kann darauf klicken. Diese URL lädt eine Seite für den Benutzer, um sich bei seinem Konto anzumelden und meiner App den Zugriff zu erlauben. Das Ergebnis kommt als Antwort auf http://localhost zurück. Aus diesem Grund starte ich eine Instanz von HTTPServer, um mit dem Verifizierungstoken auf die Anfrage zu warten.

Dieser Prozess ist weniger als ideal. Ich möchte die Autorisierungs-URL programmgesteuert laden. Die Schwierigkeit besteht darin, dass ich sicherstellen muss, dass mein lokaler Server gestartet wird, bevor die Autorisierung geladen wird. Soweit ich das beurteilen kann, blockiert server_forever() den aktuellen Thread. Dies deutet darauf hin, dass ich einen Thread starten muss, um den Server hochzufahren. Wie mache ich das? Und noch wichtiger: Wie kann ich feststellen, dass der Server gestartet wurde, damit die URL sicher geladen werden kann? Und schließlich, wie lade ich tatsächlich die URL in einem Browser?

Antwort