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中使用PIL模块处理图像的教程
Apr 29 Python
python实现简单http服务器功能
Sep 17 Python
浅析Python函数式编程
Oct 06 Python
python中pytest收集用例规则与运行指定用例详解
Jun 27 Python
Python中print函数简单使用总结
Aug 05 Python
使用Python自动生成HTML的方法示例
Aug 06 Python
python清空命令行方式
Jan 13 Python
python opencv 检测移动物体并截图保存实例
Mar 10 Python
pyCharm 实现关闭代码检查
Jun 09 Python
Python爬虫基于lxml解决数据编码乱码问题
Jul 31 Python
PyCharm2019.3永久激活破解详细图文教程,亲测可用(不定期更新)
Oct 29 Python
Python竟然能剪辑视频
May 25 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 文件缓存的性能测试
2010/04/25 PHP
组合算法的PHP解答方法
2012/02/04 PHP
PHP编码转换
2012/11/05 PHP
探讨GDFONTPATH能否被winxp下的php支持
2013/06/21 PHP
php制作动态随机验证码
2015/02/12 PHP
php微信开发之带参数二维码的使用
2016/08/03 PHP
PHP获取指定日期是星期几的实现方法
2016/11/30 PHP
实用javaScript技术-屏蔽类
2006/08/15 Javascript
JavaScript语言对Unicode字符集的支持详解
2014/12/30 Javascript
javascript限制文本框输入值类型的方法
2015/05/07 Javascript
详解js数组的完全随机排列算法
2016/12/16 Javascript
JS实现touch 点击滑动轮播实例代码
2017/01/19 Javascript
jquery实现折叠菜单效果【推荐】
2017/03/08 Javascript
使用puppeteer破解极验的滑动验证码
2018/02/24 Javascript
vue中rem的配置的方法示例
2018/08/30 Javascript
利用Vue实现一个markdown编辑器实例代码
2019/05/19 Javascript
vue+express+jwt持久化登录的方法
2019/06/14 Javascript
微信小程序自定义波浪组件使用方法详解
2019/09/21 Javascript
Vue el-autocomplete远程搜索下拉框并实现自动填充功能(推荐)
2019/10/25 Javascript
React实现类似淘宝tab居中切换效果的示例代码
2020/06/02 Javascript
[01:31]完美与DOTA2历程
2014/07/31 DOTA
python利用beautifulSoup实现爬虫
2014/09/29 Python
Python爬虫设置代理IP的方法(爬虫技巧)
2018/03/04 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
2019/01/23 Python
详解canvas绘制多张图的排列顺序问题
2019/01/21 HTML / CSS
捷克体育用品购物网站:D-sport
2017/12/28 全球购物
Clearly澳大利亚:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
L’Artisan Parfumeur官网:法国香水品牌
2020/08/11 全球购物
大学生工作推荐信范文
2013/12/02 职场文书
毕业生实习鉴定
2013/12/11 职场文书
经典导游欢迎词大全
2014/01/16 职场文书
八一建军节活动方案
2014/02/10 职场文书
事业单位竞聘上岗实施方案
2014/03/28 职场文书
给校长的建议书400字
2014/05/15 职场文书
五一促销活动总结
2014/07/01 职场文书
财务部岗位职责范本
2015/04/14 职场文书