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启动办公软件进程(word、excel、ppt、以及wps的et、wps、wpp)
Apr 09 Python
python服务器与android客户端socket通信实例
Nov 12 Python
Python实现队列的方法
May 26 Python
Python贪心算法实例小结
Apr 22 Python
详解python中的hashlib模块的使用
Apr 22 Python
Python3.5面向对象与继承图文实例详解
Apr 24 Python
Python读取xlsx文件的实现方法
Jul 04 Python
Django Rest framework三种分页方式详解
Jul 26 Python
3种python调用其他脚本的方法
Jan 06 Python
tensorflow实现在函数中用tf.Print输出中间值
Jan 21 Python
python实现替换word中的关键文字(使用通配符)
Feb 13 Python
tensorflow实现从.ckpt文件中读取任意变量
May 26 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
PHP4实际应用经验篇(7)
2006/10/09 PHP
PHP版自动生成文章摘要
2008/07/23 PHP
PHP实现从远程下载文件的方法
2015/03/12 PHP
jQuery 全选效果实现代码
2009/03/23 Javascript
javascript mouseover、mouseout停止事件冒泡的解决方案
2009/04/07 Javascript
jQuery 使用手册(五)
2009/09/23 Javascript
JavaScript中的Math.LOG2E属性使用详解
2015/06/14 Javascript
JavaScript设置表单上传时文件个数的方法
2015/08/11 Javascript
jquery点击缩略图切换视频播放特效代码分享
2015/09/15 Javascript
基于js里调用函数时,函数名带括号和不带括号的区别
2016/07/28 Javascript
浅析使用BootStrap TreeView插件实现灵活配置快递模板
2016/11/28 Javascript
微信小程序 五星评分(包括半颗星评分)实例代码
2016/12/14 Javascript
Bootstrap实现提示框和弹出框效果
2017/01/11 Javascript
angularJS深拷贝详解
2017/03/23 Javascript
LayUI动态设置checkbox不显示的解决方法
2019/09/02 Javascript
axios如何取消重复无用的请求详解
2019/12/15 Javascript
你可能从未使用过的11+个JavaScript特性(小结)
2020/01/08 Javascript
Vue实现简单计算器案例
2020/02/25 Javascript
H5+css3+js搭建带验证码的登录页面
2020/10/11 Javascript
[54:08]LGD女子刀塔学院 DOTA2炼金术士教学
2014/01/09 DOTA
[01:10:58]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
Python2.7编程中SQLite3基本操作方法示例
2017/08/09 Python
Numpy中stack(),hstack(),vstack()函数用法介绍及实例
2018/01/09 Python
Python实现简单的列表冒泡排序和反转列表操作示例
2019/07/10 Python
django重新生成数据库中的某张表方法
2019/08/28 Python
python 实现图像快速替换某种颜色
2020/06/04 Python
Python中的面向接口编程示例详解
2021/01/17 Python
俄罗斯旅游网站:Tripadvisor俄罗斯
2017/03/21 全球购物
印度尼西亚最大的电商平台:Tokopedia(印尼版淘宝)
2017/12/02 全球购物
英国邮购活的植物主要供应商:Gardening Direct
2019/01/28 全球购物
C语言面试题
2015/10/30 面试题
如何提高SQL Server的安全性
2016/07/25 面试题
《长城》教学反思
2014/02/14 职场文书
春季运动会加油词
2015/07/18 职场文书
厉害!这是Redis可视化工具最全的横向评测
2021/07/15 Redis
mysql如何能有效防止删库跑路
2021/10/05 MySQL