从零开始用 Flask 搭建一个网站(四) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
jpush
V2EX    Python

从零开始用 Flask 搭建一个网站(四)

  •  
  •   jpush
    jpush 2017 年 4 月 17 日 2430 次点击
    这是一个创建于 3261 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前言

    从零开始用 Flask 搭建一个网站(三) 介绍了网页前端与后端、前端与前端之间数据的交流。本节主要介绍一下如何应用 Flask-OAuthlib, 使用 Flask-OAuthlib 就可以轻松地请求第三方应用提供的 API 。 GitHub 上 example 给出了一些如何使用的简单例子,但是就实际运用来说还有需要注意的地方。

    安装与初始化

    在终端中使用命令:

    pip install Flask-OAuthlib 

    或者:

    easy_install Flask-OAuthlib 

    就可以完成自动安装。在项目中初始化 oauth 也是比较简单的, 以 QQ 为例:

    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 。这个范围可以视自己的需求而定。

    请求数据

    首先来介绍一下第三方登录,在点击登录后,登录按钮触发的视图函数如下:

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

    这个 authorize 函数会发送一个请求,跳转到第三方登录界面,用户登录完成后,将会回调传递的 Url ,返回一个带授权 token 的响应:

    @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 搭建一个网站(四)

    知乎专栏:极光日报

    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1464 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 16:45 PVG 00:45 LAX 09:45 JFK 12:45
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86