從零開始用 Flask 搭建一個網站(四)

前言前端

從零開始用 Flask 搭建一個網站(三) 介紹了網頁前端與後端、前端與前端之間數據的交流。本節主要介紹一下如何應用 Flask-OAuthlib, 使用 Flask-OAuthlib 就能夠輕鬆地請求第三方應用提供的 API 。 GitHub 上 example 給出了一些如何使用的簡單例子,可是就實際運用來講還有須要注意的地方。git

安裝與初始化github

在終端中使用命令:web

pip install Flask-OAuthlib

或者:json

easy_install Flask-OAuthlib

就能夠完成自動安裝。在項目中初始化 oauth 也是比較簡單的, 以 QQ 爲例:flask

from flask_oauthlib.client import OAuth

app = Flask(__name__)
oauth = OAuth(app)

qq = oauth.remote_app(   
   'qq',    
  consumer_key=QQ_APP_ID,    
  consumer_secret=QQ_APP_KEY,    
  base_url='https://graph.qq.com',    
  request_token_url=None,    
  request_token_params={'scope': 'get_user_info'},    
  access_token_url='/oauth2.0/token',    
  authorize_url='/oauth2.0/authorize',
)

須要注意的是 consumer_key 以及 consumer_secret ,這兩個要替換成本身在第三方提供者中申請的應用的 App_ID 以及 App_Key 。若是是生產環境,一般要把這兩個參數放到環境變量中。其餘的參數值在第三方的開發者文檔中都有提供。另外這個 scope 字段的值代表了在應用中你請求的 token 的實際使用權限,上面的權限僅僅是 get_user_info 。這個範圍能夠視本身的需求而定。segmentfault

請求數據後端

首先來介紹一下第三方登陸,在點擊登陸後,登陸按鈕觸發的視圖函數以下:api

@main.route('/login')
def login():    
    return qq.authorize(callback=url_for('main.authorized', _external=True))

這個 authorize 函數會發送一個請求,跳轉到第三方登陸界面,用戶登陸完成後,將會回調傳遞的 Url ,返回一個帶受權 token 的響應:session

@main.route('/login/authorized')
def authorized():    
    resp = qq.authorized_response()    
    if resp is None:        
        return 'Access denied: reason=%s error=%s' % (            
            request.args['error_reason'],            
            request.args['error_description']        
        )    
    session['qq_token'] = (resp['access_token'], '')

這裏把 token 存儲在 session 中,方便下次使用。使用 OAuthlib 能夠發起 Http 請求,好比 GET 請求:

respMe = qq.get('/oauth2.0/me', {'access_token': session['qq_token'][0]})

這裏傳了一個 access_token 參數,須要注意的是這個 token 是一個元組:(「 token 」, ""),第二個元素爲空。在使用這些 Http 請求時,若是沒有帶上 token ,必須使用 oauthlib 提供的 tokengetter 修飾器定義一個返回 token 的函數:

@qq.tokengetter
def get_qq_oauth_token():    
    return session.get('qq_token')

這裏返回的 token 也是一個元組,而不是字符串。在定義了獲取 token 的函數後,就能夠不帶 access_token 參數了, oauthlib 將會自動調用這個函數獲得 token 。好比:

response = github.get("user")
username = response.data["login"]

若是要在請求中傳遞數據,能夠這樣:

data_dict = {
    "name": "web",             
    "active": True,             
    "events": [                 
        "push",                 
        "commit_comment",                 
        "pull_request",                 
        "issues",                 
        "issue_comment"             
    ],             
    "config": {                
        "url": "http://your webhook",                 
        "content_type": "json"             
    }
}
response = github.post('https://api.github.com/repos/{user}/{repo}/hooks", data=data_dict, format='json')

上面是 github 中建立 Webhook 的示例,在 data 中傳遞了一個字典,這個字典將會被解析爲 Json 對象並被保留在請求的 body 中。 OAuthlib 0.9.3 版本除了 GET 請求之外必須攜帶一個 data ,這是一個已知的 bug。這裏筆者使用的版本是 0.9.2 。

以上就是關於 OAuthlib 使用的講解。到此爲止,咱們一塊兒學習瞭如何從零開始用 Flask 搭建了一個網站,咱們的網址是: http://jbox.jiguang.cn/ 一個極光寶盒控制檯,能夠用來集成第三方應用,並及時在手機上收到推送。好比使用使用極光寶盒集成一個 GitHub 應用,這樣就能夠監聽本身以及團隊的倉庫,在別人提交 commit 或者 issue 後,能夠及時反饋到手機上;也能夠是自定義的集成,用於小組之間會議通知,活動通知等等。咱們後續也會推出更多的第三方集成,感謝你們一直以來的支持,咱們的源碼在 GitHub 上。

做者: KenChoi - 極光( JPush 爲極光團隊帳號,歡迎關注)

原文:從零開始用 Flask 搭建一個網站(四)

知乎專欄:極光日報

相關文章
相關標籤/搜索