前言前端
从零开始用 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 搭建一个网站(四)
知乎专栏:极光日报