Django项目中实现使用qq第三方登录功能


Posted in Python onAugust 13, 2019

使用qq登录的前提是已经在qq互联官网创建网站应用并获取到QQ互联中网站应用的APP ID和APP KEY

1,建路由

#  qq登录
 path('loginQq/',qq.loginQq,name='loginQq/'),
 path('returns/',qq.returns,name='returns/'),

2,前端页面写qq登录的链接,本文没有用图标,暂时使用a链接请求。

<a data-wow-delay=".5s" href="/blog/loginQq/" rel="external nofollow" > » QQ登录</a>

3,在项目的应用下创建utils文件夹并创建function.py用于封装函数,封装的函数用于从返回数据中提取openid(腾讯公司数据库里面的用户id)

Django项目中实现使用qq第三方登录功能

封装的函数内容如下;

import re
def parse_jsonp(jsonp_str):
 try:
  return re.search('^[^(]*?\((.*)\)[^)]*$', jsonp_str).group(1)
 except:
  raise ValueError('无效数据!')

4,后台代码

from django.shortcuts import render,redirect,HttpResponse,HttpResponseRedirect
from blog.models import Member
from urllib import parse
from urllib import request as req
import re
import json
import random
from blog.utils import function
def loginQq(request):
 state = str(random.randrange(100000,999999)) # 定义一个随机状态码,防止跨域伪造攻击。
 request.session['state'] = state # 将随机状态码存入Session,用于授权信息返回时验证。
 client_id = '101716344' # QQ互联中网站应用的APP ID。
 # 对回调地址进行编码,用户同意授权后将调用此链接。
 callback = parse.urlencode({'redirect_uri':'http://127.0.0.1:8000/blog/returns'}) #redirect_uri=http%3A%2F%2F127.0.0.1%3A8000%2Fblog%2Freturns
 # 组织QQ第三方登录链接
 login_url = 'https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=%s&%s&state=%s'%(client_id,callback,state)
 return HttpResponseRedirect(login_url) # 重定向到QQ第三方登录授权页面
def returns(request):
 if request.session['state'] == request.GET['state']: # 验证状态码,防止跨域伪造攻击。
  code = request.GET['code'] # 获取用户授权码
  client_id = '101716344' # QQ互联中网站应用的APP ID。
  client_secret = '7f42aaac69f866750078fbe1edd9d2a4' # QQ互联中网站应用的APP Key。
  callback = parse.urlencode({'redirect_uri': 'http://127.0.0.1:8000/blog/returns'})
  # 对回调地址进行编码,用户同意授权后将调用此链接。
  login_url = 'https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&code=%s&client_id=%s&client_secret=%s&%s' % (code, client_id, client_secret, callback) # 组织获取访问令牌的链接
  # return HttpResponse(login_url)
  response = req.urlopen(login_url).read().decode() # 打开获取访问令牌的链接 access_token:123456789&
  access_token = re.split('&', response)[0] # 获取访问令牌 access_token:123456789
  res = req.urlopen('https://graph.qq.com/oauth2.0/me?' + access_token).read().decode() # 打开获取openid的链接
  openid = json.loads(function.parse_jsonp(res))['openid'] # 从返回数据中获取openid 410225632333335556566
  userinfo = req.urlopen('https://graph.qq.com/user/get_user_info?oauth_consumer_key=%s&openid=%s&%s' % (
   client_id, openid, access_token)).read().decode() # 打开获取用户信息的链接
  # 打印查看获取到的用户信息
  print(userinfo)
  userinfo = json.loads(userinfo) # 将返回的用户信息数据(JSON格式)读取为字典。
  user = Member.objects.filter(member_qq_id=openid) # 查询是否已存在用户
  if not user: # 如果不存在用户
   # 创建新用户
   member_obj = Member.objects.create(member_qq_id=openid,member_nickname=userinfo['nickname'],member_name=userinfo['nickname'],member_photo = userinfo['figureurl_qq_1'])
   # user = Member() # 创建新用户
   # user.member_qq_id = openid # 写入用户信息
   # user.member_nickname = userinfo['nickname'] # 写入用户信息
   # user.member_name = userinfo['nickname'] # 写入用户信息
   # # user.gender = userinfo['gender'] # 写入用户信息
   # user.member_photo = userinfo['figureurl_qq_1'] # 写入用户信息
   # user.save() # 保存或更新用户
   request.session['member_id'] = member_obj.member_id # 将已登录的用户openid写入Session
   request.session['member_name'] = userinfo['nickname']
  # 返回路径至网站首页
  return redirect('/blog/index/')
 else:
  return HttpResponse('授权失败!')

本文是在本地测试项目中的qq登录功能,所以qq互联官网中的回调地址需要修改为本地的地址,

5,启动项目测试功能

6,查看数据库会员表,会员信息已写入。

Django项目中实现使用qq第三方登录功能

总结

以上所述是小编给大家介绍的Django项目中实现使用qq第三方登录功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Django项目中实现使用qq第三方登录功能

Django项目中实现使用qq第三方登录功能

Python 相关文章推荐
简要讲解Python编程中线程的创建与锁的使用
Feb 28 Python
Python获取当前公网ip并自动断开宽带连接实例代码
Jan 12 Python
Python设计模式之组合模式原理与用法实例分析
Jan 11 Python
python绘制双Y轴折线图以及单Y轴双变量柱状图的实例
Jul 08 Python
python base64库给用户名或密码加密的流程
Jan 02 Python
Python实现钉钉订阅消息功能
Jan 14 Python
opencv python在视屏上截图功能的实现
Mar 05 Python
Django调用百度AI接口实现人脸注册登录代码实例
Apr 23 Python
keras 自定义loss层+接受输入实例
Jun 28 Python
python爬虫线程池案例详解(梨视频短视频爬取)
Feb 20 Python
PyQt5 显示超清高分辨率图片的方法
Apr 11 Python
python自动化八大定位元素讲解
Jul 09 Python
一篇文章搞定Python操作文件与目录
Aug 13 #Python
Python Django Cookie 简单用法解析
Aug 13 #Python
Django中ajax发送post请求 报403错误CSRF验证失败解决方案
Aug 13 #Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
Aug 13 #Python
Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答
Aug 13 #Python
Django rstful登陆认证并检查session是否过期代码实例
Aug 13 #Python
Python Request爬取seo.chinaz.com百度权重网站的查询结果过程解析
Aug 13 #Python
You might like
PHP在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】
2016/10/14 PHP
基于PHP实现栈数据结构和括号匹配算法示例
2017/08/10 PHP
PHP自动生成缩略图函数的源码示例
2019/03/18 PHP
通用于ie和firefox的函数 GetCurrentStyle (obj, prop)
2006/12/27 Javascript
JavaScript 编程引入命名空间的方法
2007/06/29 Javascript
JMenuTab简单使用说明
2008/03/13 Javascript
jquery验证表单中的单选与多选实例
2013/08/18 Javascript
JavaScript 动态加载脚本和样式的方法
2015/04/13 Javascript
javascript实现一个数值加法函数
2015/06/26 Javascript
JQUERY实现网页右下角固定位置展开关闭特效的方法
2015/07/27 Javascript
不能不知道的10个angularjs英文学习网站
2016/03/23 Javascript
AngularJS学习笔记之依赖注入详解
2016/05/16 Javascript
详解angular中如何监控dom渲染完毕
2017/01/03 Javascript
Bootstrap选项卡学习笔记分享
2017/02/13 Javascript
微信小程序实现人脸识别
2018/05/25 Javascript
详解Angular5/Angular6项目如何添加热更新(HMR)功能
2018/10/10 Javascript
Element-UI踩坑之Pagination组件的使用
2018/10/29 Javascript
Angular Excel 导入与导出的实现代码
2019/04/17 Javascript
浅析JavaScript中的事件委托机制跟深浅拷贝
2021/01/20 Javascript
python函数缺省值与引用学习笔记分享
2013/02/10 Python
Python函数中*args和**kwargs来传递变长参数的用法
2016/01/26 Python
常见python正则用法的简单实例
2016/06/21 Python
python实现三维拟合的方法
2018/12/29 Python
Python实现的微信支付方式总结【三种方式】
2019/04/13 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
2019/12/19 Python
python如何停止递归
2020/09/09 Python
考试作弊被抓检讨书
2014/10/02 职场文书
党的群众路线批评与自我批评范文
2014/10/16 职场文书
优秀团员事迹材料
2014/12/25 职场文书
神龙架导游词
2015/02/11 职场文书
一般纳税人申请报告
2015/05/18 职场文书
永不妥协观后感
2015/06/10 职场文书
2016年清明节寄语
2015/12/04 职场文书
自荐信范文
2019/05/20 职场文书
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
2021/06/18 MySQL
在MySQL中你成功的避开了所有索引
2022/04/20 MySQL