2016-12-11 9 views
2

私は現在のURLでそれを行う方法を知っています。paramsをPythonリクエストで実行した後、そのURLからどのようにパラメータを取得しますか?

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

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

しかし、あなたは一例

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

ため、URL、OAuthを持つものなどを訪問した後場合についてURLは、その後https://localhost:5000/authorized?code=AQCvFなどのいずれかに直接なりますか。 code=AQCvFを入手するにはどうすればよいですか?

おそらく、現在のブラウザのアドレスを取得してURLを解析するなどの方法がありますが、よりクリーンな方法がありますか?


完全なコードは、以下である:

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) 

答えて

1

あなたが得ることができます.url attribute from the Response object - これは最終応答URLのようになります。

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

これは完全に私にとって論理的なようです!残念ながら、response.urlが返す応答は私の 'REDIRECT_URI'です。この場合' https:// www.facebook.com/connect/login_success.html'であり、 'code'パラメータのあるURLではありません。探している。 – Aspen

+0

一方、 'webbrowser.open(authorized_url)'を追加すると、正しいURLがアドレスバーに表示されます。 – Aspen

+1

@Adrienne gotcha、これまでの完全なコードを提供してください。リダイレクションチェーンのフィナーレにアクセスするには、実際のブラウザが必要で、テストしたいと思うかもしれないと思う。ありがとう! – alecxe

1
:あなたはGETパラメータを抽出するためのURLを urlparseすることができ、その後

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

同期Pythonフレームワークを使用していた場合、コードは正常に動作しますが、非同期フレームを使用しているようです仕事は、async def on_get(self, req, res)で暗示されています。

非同期HTTPリクエスト機能を使用するか、aiohttp.webを使用するか、フレームワークにフレームが組み込まれていて、requests.get(facebook.get_authorize_url(**params))res.redirect(facebook.get_authorize_url(**params))に置き換える必要があります。

+0

ああ、良い観測、共有ありがとう! – alecxe

関連する問題