2016-12-11 6 views
2

Ich weiß, wie es mit einer aktuellen URL z.Wie erhalten Sie die Parameter von einer URL, nachdem Sie sie mit Python-Anfragen ausgeführt haben?

>>> payload = {'key1': 'value1', 'key2': ['value2', 'value3']} 

>>> r = requests.get('http://httpbin.org/get', params=payload) 
>>> print(r.url) 

Aber was ist, wenn, nachdem Sie eine URL besuchen, wie man mit OAuth, zum Beispiel

authorize_url = facebook.get_authorize_url(**params) 
requests.get(authorized_url) 

Die URL dann an einem wie https://localhost:5000/authorized?code=AQCvF leiten wird. Wie bekomme ich die code=AQCvF?

Ich könnte wahrscheinlich so etwas tun, die Adresse des aktuellen Browsers abrufen und dann die URL analysieren, aber gibt es einen saubereren Weg?


komplette Code ist unten:

index.j2

<p><a href="/facebook-login">Login with Facebook</a></p> 

routes.py

app.add_route('/facebook-login', LoginHandler('index.j2')) 
app.add_route('/authorized', AuthorizedHandler('index.j2')) 

handlers.py

from rauth.service import OAuth2Service 
import requests 
import os 

# rauth OAuth 2.0 service wrapper 
graph_url = 'https://graph.facebook.com/' 
facebook = OAuth2Service(name='facebook', 
         authorize_url='https://www.facebook.com/dialog/oauth', 
         access_token_url=graph_url + 'oauth/access_token', 
         client_id=FB_CLIENT_ID, 
         client_secret=FB_CLIENT_SECRET, 
         base_url=graph_url) 


class AuthorizedHandler(TemplateHandler): 

    def on_get(self, req, res): 
     code = self.requests.get['code'] 
     data = dict(code=code, redirect_uri=REDIRECT_URI) 
     session = facebook.get_auth_session(data=data) 

     # response 
     me = session.get('me').json() 
     print('me', me) 

     UserController.create(me['username'], me['id']) 


class LoginHandler(TemplateHandler): 

    async def on_get(self, req, res): 
     # visit URL and client authorizes 
     params = {'response_type': 'code', 
        'redirect_uri': REDIRECT_URI} 

     webbrowser.open(facebook.get_authorize_url(**params)) 

     response = requests.get(facebook.get_authorize_url(**params)) 
     print(response.url) 

Antwort

1

Sie können das bekommen .url attribute from the Response object - dies würde die letzte Antwort-URL sein:

response = requests.get(authorized_url) 
print(response.url) 

Dann können Sie die URL urlparse die GET-Parameter zu extrahieren:

In [1]: from urllib.parse import parse_qs, urlparse 

In [2]: url = "https://localhost:5000/authorized?code=AQCvF" 

In [3]: parse_qs(urlparse(url).query) 
Out[3]: {'code': ['AQCvF']} 
+0

Das scheint mir völlig logisch! Leider ist die Antwort, die response.url zurückgibt, meine 'REDIRECT_URI', die in diesem Fall 'https: // www.facebook.com/connect/login_success.html' ist und nicht die URL mit dem' code' param I'm Auf der Suche nach. – Aspen

+0

Auf der anderen Seite wird die korrekte URL in der Adressleiste erscheinen, wenn ich 'webbrowser.open (authorized_url)' ' – Aspen

+1

@Adrienne gotcha, können Sie bitte Ihren vollständigen Code bis jetzt hinzufügen? Ich vermute, es könnte sein, dass Sie einen echten Browser benötigen, um zum Finale der Umleitungskette zu gelangen, um es zu testen. Vielen Dank! – alecxe

1

Ihr Code würde gut funktionieren, wenn Sie ein synchrones Python-Framework verwenden, aber es scheint, dass Sie einen asynchronen Rahmen verwenden Arbeit, wie impliziert durch die async def on_get(self, req, res).

Sie müssen entweder eine asynchrone HTTP-Anforderungsfunktion schreiben, aiohttp.web verwenden, oder Ihr Framework hat möglicherweise einen eingebauten und Sie können durch res.redirect(facebook.get_authorize_url(**params)) ersetzen.

+0

Oh, gute Beobachtung, danke fürs Teilen! – alecxe

Verwandte Themen