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-04-17 13:34:22 +08:00 · 2025 次点击
    这是一个创建于 2784 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前言

    从零开始用 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   ·   实用小工具   ·   2670 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 10:14 · PVG 18:14 · LAX 02:14 · JFK 05:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.