从零开始用 Flask 搭建一个网站(四)
前言
从零开始用 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 搭建一个网站(四)的更多相关文章
- 从零开始用 Flask 搭建一个网站(一)
前言 笔者之前未接触过 Python,只是略懂一点前端,所以说从零开始也相差无几吧.Flask 是一个轻量级的基于 Python 的框架,但是扩展性非常良好(Github 上 22000 多个 sta ...
- 从零开始用 Flask 搭建一个网站(三)
从零开始用 Flask 搭建一个网站(二) 介绍了有关于数据库的运用,接下来我们在完善一下数据在前端以及前端到后端之间的交互.本节涉及到前端,因此也会讲解一下 jinja2 模板.jQuery.aja ...
- 从零开始用 Flask 搭建一个网站(二)
从零开始用 Flask 搭建一个网站(一) 介绍了如何搭建 Python 环境,以及 Flask 应用基本项目结构.我们要搭建的网站是管理第三方集成的控制台,类似于 Slack. 本篇主要讲解数据如何 ...
- Python Flask搭建一个视频网站实战视频教程
点击了解更多Python课程>>> Python Flask搭建一个视频网站实战视频教程 第1章 课程介绍 第2章 预备开发环境 第3章 项目分析.建立目录及模型规划 第4章 建立前 ...
- 05、(通过nat123软件) 实现用自己电脑搭建一个网站
(通过nat123软件) 实现用自己电脑搭建一个网站 准备: Tomcat:这个是web容器,其实有了这个就已经让电脑成为服务器了,在自己电脑上可以通过 localhost:8080/xxx 来访问自 ...
- Python - 利用flask搭建一个共享服务器
零.概述 我利用flask搭建了一个简易的共享服务器,分享给大家 一.python代码 import os import time from flask import Flask,render_tem ...
- 3分钟搭建一个网站?腾讯云Serverless开发体验
作为一个开发者,应该都能理解一个网站从开发到上线,要经过很多繁琐的步骤. 编写代码,部署应用,部署数据库,申请域名,申请SSL证书,域名备案,到最终上线起码要几天时间. 作为一个不精通代码的业务玩家, ...
- [译]简单得不得了的教程-一步一步用 NODE.JS, EXPRESS, JADE, MONGODB 搭建一个网站
原文: http://cwbuecheler.com/web/tutorials/2013/node-express-mongo/ 原文的源代码在此 太多的教程教你些一个Hello, World!了, ...
- 教程:动手用自己电脑搭建一个网站 (nat123 花生壳 动态域名 个人电脑做服务器)
先ps一下..今晚试了N种方法,终于找到一个靠谱 免费 好用的方法,来改装自己电脑成为服务器,在外网也能通过域名访问了!!! 需要准备的东西: Tomcat:这个是web容器,其实有了这个就已经让电脑 ...
随机推荐
- 刷题向》一道简单的思路题BZOJ1800(EASY+)
这道题其实并不难,主要原因是数据范围很小,当然数据如果大来也可以优化,但重点是在做的时候用的思路很通用, 所以本题是一道思想题(当然思想也不难) 标题里的“+”体现在一些边界处理中. 直接甩题目 De ...
- 开启Windows8里面的Hyper-V虚拟机功能
首先了解下什么是Hyper-V?也就是虚拟化技术,允许终端用户在同一台机器上运行多个操作系统,支持32位和64位系统,可以直接在Windows 8上创建自己的虚拟机.开启Hyper-V虚拟机需要更多的 ...
- "分辨率"到底是个什么概念?它和DPI之间是什么关系?
"分辨率"到底是个什么概念?它和DPI之间是什么关系? 分辨率:显示分辨率(屏幕分辨率)是屏幕图像的精密度,是指显示器所能显示的像素有多少.由于屏幕上的点.线和面都是由像素组成的, ...
- 2018年最新 Java面试通关要点汇总集
基础篇 基本功 面向对象的特征 final, finally, finalize 的区别 int 和 Integer 有什么区别 重载和重写的区别 抽象类和接口有什么区别 说说反射的用途及实现 说说自 ...
- Java设计模式(3)——抽象工厂模式
抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的.抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象. 一.产品族和产品等级结构 为 ...
- gradle创建spring-boot项目
刚来新公司,熟悉了公司项目搭建的框架,了解到了一种新的项目管理工具:gradle,从网上了解,据说比maven更加灵活化,于是便学习了一番.在此记录下来,一遍以后使用.gradle的安装就不说了,网上 ...
- [GO]使用select实现斐波那契
package main import "fmt" func fibonacci(ch chan <- int, quit <- chan bool) { x, y : ...
- #2002 无法登录 MySQL 服务器
phpMyAdmin无法登录,输入用户名和密码后点击“执行”后一直报 “#2002 无法登录 MySQL 服务器”. 解决办法,将 “phpMyAdmin/libraries”文件夹下的config. ...
- XJOI 3578 排列交换/AtCoder beginner contest 097D equal (并查集)
题目描述: 你有一个1到N的排列P1,P2,P3...PN,还有M对数(x1,y1),(x2,y2),....,(xM,yM),现在你可以选取任意对数,每对数可以选取任意次,然后对选择的某对数(xi, ...
- ViewResolver 视图解析器
pringMVC 视图解析器 前言 在前一篇博客中讲了 SpringMVC 的Controller 控制器,在这篇博客中将接着介绍一下 SpringMVC 视图解析器.当我们对SpringMVC控制的 ...