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写的ARP攻击代码实例
Jun 04 Python
举例详解Python中的split()函数的使用方法
Apr 07 Python
python rsa 加密解密
Mar 20 Python
Python中使用支持向量机SVM实践
Dec 27 Python
python opencv之分水岭算法示例
Feb 24 Python
实例详解Matlab 与 Python 的区别
Apr 26 Python
使用Python中的reduce()函数求积的实例
Jun 28 Python
.dcm格式文件软件读取及python处理详解
Jan 16 Python
python烟花效果的代码实例
Feb 25 Python
windows上彻底删除jupyter notebook的实现
Apr 13 Python
使用Nibabel库对nii格式图像的读写操作
Jul 01 Python
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
May 21 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+iframe实现隐藏无刷新上传文件
2012/02/10 PHP
解析PHP实现下载文件的两种方法
2013/07/05 PHP
php一些错误处理的方法与技巧总结
2013/08/10 PHP
php单例模式实现方法分析
2015/03/14 PHP
Zend Framework教程之Resource Autoloading用法实例
2016/03/08 PHP
Symfony2学习笔记之模板用法详解
2016/03/17 PHP
json简单介绍
2008/06/10 Javascript
javascript实现的像java、c#之类的sleep暂停的函数代码
2010/03/04 Javascript
js window.open弹出新的网页窗口
2014/01/16 Javascript
使用JavaScript 编写简单计算器
2014/11/24 Javascript
jQuery实现长按按钮触发事件的方法
2015/02/02 Javascript
JavaScript验证Email(3种方法)
2015/09/21 Javascript
JavaScript操作XML/HTML比较常用的对象属性集锦
2015/10/30 Javascript
bootstrap table配置参数例子
2017/01/05 Javascript
vue watch自动检测数据变化实时渲染的方法
2018/01/16 Javascript
vue+iview+less 实现换肤功能
2018/08/17 Javascript
JS Object.preventExtensions(),Object.seal()与Object.freeze()用法实例分析
2018/08/25 Javascript
Vue实现简单分页器
2018/12/29 Javascript
微信小程序 如何获取网络状态
2019/07/26 Javascript
基于Element的组件改造的树形选择器(树形下拉框)
2020/02/27 Javascript
如何修改Vue打包后文件的接口地址配置的方法
2020/04/22 Javascript
[16:27]DOTA2 HEROS教学视频教你分分钟做大人-艾欧
2014/06/11 DOTA
TensorFlow神经网络优化策略学习
2018/03/09 Python
python3模块smtplib实现发送邮件功能
2018/05/22 Python
通过shell+python实现企业微信预警
2019/03/07 Python
在vscode中配置python环境过程解析
2019/09/28 Python
Python散点图与折线图绘制过程解析
2019/11/30 Python
python:批量统计xml中各类目标的数量案例
2020/03/10 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
2020/08/18 Python
css3类选择器之结合元素选择器和多类选择器用法
2017/03/09 HTML / CSS
详解rem 适配布局
2018/10/31 HTML / CSS
大学生最常用的自我评价
2013/12/07 职场文书
班主任经验交流材料
2014/12/16 职场文书
超市主管竞聘书
2015/09/15 职场文书
SpringBoot SpringEL表达式的使用
2021/07/25 Java/Android
windows系统安装配置nginx环境
2022/06/28 Servers