前言

从零开始用 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 - 极光

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

知乎专栏:极光日报

从零开始用 Flask 搭建一个网站(四)的更多相关文章

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

    前言 笔者之前未接触过 Python,只是略懂一点前端,所以说从零开始也相差无几吧.Flask 是一个轻量级的基于 Python 的框架,但是扩展性非常良好(Github 上 22000 多个 sta ...

  2. 从零开始用 Flask 搭建一个网站(三)

    从零开始用 Flask 搭建一个网站(二) 介绍了有关于数据库的运用,接下来我们在完善一下数据在前端以及前端到后端之间的交互.本节涉及到前端,因此也会讲解一下 jinja2 模板.jQuery.aja ...

  3. 从零开始用 Flask 搭建一个网站(二)

    从零开始用 Flask 搭建一个网站(一) 介绍了如何搭建 Python 环境,以及 Flask 应用基本项目结构.我们要搭建的网站是管理第三方集成的控制台,类似于 Slack. 本篇主要讲解数据如何 ...

  4. Python Flask搭建一个视频网站实战视频教程

    点击了解更多Python课程>>> Python Flask搭建一个视频网站实战视频教程 第1章 课程介绍 第2章 预备开发环境 第3章 项目分析.建立目录及模型规划 第4章 建立前 ...

  5. 05、(通过nat123软件) 实现用自己电脑搭建一个网站

    (通过nat123软件) 实现用自己电脑搭建一个网站 准备: Tomcat:这个是web容器,其实有了这个就已经让电脑成为服务器了,在自己电脑上可以通过 localhost:8080/xxx 来访问自 ...

  6. Python - 利用flask搭建一个共享服务器

    零.概述 我利用flask搭建了一个简易的共享服务器,分享给大家 一.python代码 import os import time from flask import Flask,render_tem ...

  7. 3分钟搭建一个网站?腾讯云Serverless开发体验

    作为一个开发者,应该都能理解一个网站从开发到上线,要经过很多繁琐的步骤. 编写代码,部署应用,部署数据库,申请域名,申请SSL证书,域名备案,到最终上线起码要几天时间. 作为一个不精通代码的业务玩家, ...

  8. [译]简单得不得了的教程-一步一步用 NODE.JS, EXPRESS, JADE, MONGODB 搭建一个网站

    原文: http://cwbuecheler.com/web/tutorials/2013/node-express-mongo/ 原文的源代码在此 太多的教程教你些一个Hello, World!了, ...

  9. 教程:动手用自己电脑搭建一个网站 (nat123 花生壳 动态域名 个人电脑做服务器)

    先ps一下..今晚试了N种方法,终于找到一个靠谱 免费 好用的方法,来改装自己电脑成为服务器,在外网也能通过域名访问了!!! 需要准备的东西: Tomcat:这个是web容器,其实有了这个就已经让电脑 ...

随机推荐

  1. CMDB-客户端

    配置文件的设置 大体思路: 1,通过开始文件将用户配置信息的文件放置到环境变量中. 2,在lib文件中的config文件中,从环境变量中获取到用户的配置,通过importlib模块导入用户配置文件,通 ...

  2. SVN的“Invalid authz configuration”错误的解决方法

    公司有人离职后,我把他svn账号删除 然后就报这个错了,我检查了authz文件,完全看不出什么错误.... 网上的各种方法试一遍,无果. 蹲个厕所,继续查这个问题 看到一个答案: 给不存在的组配置权限 ...

  3. Codeforces 1154G 枚举

    题意:给你一堆数,问其中lcm最小的一对数是什么? 思路:因为lcm(a, b) = a * b / gcd(a, b), 所以我们可以考虑暴力枚举gcd, 然后只找最小的a和b,去更新答案即可. 数 ...

  4. 存储过程中使用事务和try catch

    一.存储过程中使用事务的简单语法 在存储过程中使用事务时非常重要的,使用数据可以保持数据的关联完整性,在Sql server存储过程中使用事务也很简单,用一个例子来说明它的语法格式: 代码 : Cre ...

  5. linux系统文件的安全与特殊权限

    一. 文件与目录的原始属性 由于不希望文件具有可执行的原始权限,默认情况下,文件是没有可执行(x)权限的,因此文件的原始属性是:-rw-rw-rw(0666) 目录的原始属性全部开放,为:-rwxrw ...

  6. 用 Markdown 写作(一)——添加文章页内导航

    Markdown 可以用更简化的标记来写文章,基本的语法可以参考Markdown 语法说明 (简体中文版). 我平时很少按照论文的写法去写博客,说来忏愧,因为很少写技术性的文章,最近看到百度百科和很多 ...

  7. code1085 数字游戏

    划分dp 把环变链(读入4 3 -1 2变成4 3 -1 2 4 3 -1 2) 设dp[i][j][k]为把i~j分成k份,各部分内的数字相加,相加所得的k个结果对10取模后再相乘,最终得到的一个数 ...

  8. vscode安装dlv插件报错:There is no tracking information for the current branch.

    vscode安装dlv插件报错:There is no tracking information for the current branch. https://blog.csdn.net/a7859 ...

  9. java操作ceph之rbd基本操作

    一.安装librados和librbd Ceph存储集群提供了基本的存储服务,允许Ceph在一个统一的系统中唯一地传送对象,块和文件存储. 但是,不限于使用RESTful,块或POSIX接口. 基于R ...

  10. QT学习之多线程

    [为什么要用多线程?] 传统的图形用户界面应用程序都只有一个执行线程,并且一次只执行一个操作.如果用户从用户界面中调用一个比较耗时的操作,当该操作正在执行时,用户界面通常会冻结而不再响应.这个问题可以 ...