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代码来绘制彭罗斯点阵的教程
Apr 03 Python
操作Windows注册表的简单的Python程序制作教程
Apr 07 Python
在Python中使用__slots__方法的详细教程
Apr 28 Python
Python函数式编程指南(一):函数式编程概述
Jun 24 Python
Pycharm 创建 Django admin 用户名和密码的实例
May 30 Python
用Python编写一个简单的CS架构后门的方法
Nov 20 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
Dec 19 Python
梅尔倒谱系数(MFCC)实现
Jun 19 Python
python opencv将图片转为灰度图的方法示例
Jul 31 Python
Python数据可视化 pyecharts实现各种统计图表过程详解
Aug 15 Python
用Python画小女孩放风筝的示例
Nov 23 Python
jupyter note 实现将数据保存为word
Apr 14 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学习笔记(一) 简单了解PHP
2014/08/04 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
2016/05/30 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
2020/02/21 PHP
javascript demo 基本技巧
2009/12/18 Javascript
利用google提供的API(JavaScript接口)获取网站访问者IP地理位置的代码详解
2010/07/24 Javascript
浅析jQuery中调用ajax方法时在不同浏览器中遇到的问题
2014/06/11 Javascript
node.js中的Socket.IO使用实例
2014/11/04 Javascript
jQuery ajax分页插件实例代码
2016/01/27 Javascript
在ASP.NET MVC项目中使用RequireJS库的用法示例
2016/02/15 Javascript
Javascript 5种方法实现过滤删除前后所有空格
2016/06/22 Javascript
bootstrap datepicker限定可选时间范围实现方法
2016/09/28 Javascript
js简单实现网页换肤功能
2017/04/07 Javascript
vue2.0 父组件给子组件传递数据的方法
2018/01/15 Javascript
微信小程序系列之自定义顶部导航功能
2019/05/21 Javascript
vue通信方式EventBus的实现代码详解
2019/06/10 Javascript
聊聊鉴权那些事(推荐)
2019/08/22 Javascript
JS加载解析Markdown文档过程详解
2020/05/19 Javascript
python简单实现旋转图片的方法
2015/05/30 Python
Python的Django框架可适配的各种数据库介绍
2015/07/15 Python
带你了解python装饰器
2017/06/15 Python
python 创建弹出式菜单的实现代码
2017/07/11 Python
Python操作Excel插入删除行的方法
2018/12/10 Python
Python数据类型之List列表实例详解
2019/05/08 Python
python程序中的线程操作 concurrent模块使用详解
2019/09/23 Python
opencv 图像加法与图像融合的实现代码
2020/07/08 Python
Python3安装模块报错Microsoft Visual C++ 14.0 is required的解决方法
2020/07/28 Python
Django日志及中间件模块应用案例
2020/09/10 Python
python3中确保枚举值代码分析
2020/12/02 Python
HTML5对比HTML4的主要改变和改进总结
2016/05/27 HTML / CSS
英国泽西岛植物:Jersey Plants Direct
2019/08/07 全球购物
希腊香水和化妆品购物网站:Parfimo.gr
2019/10/03 全球购物
体育纪念品、亲笔签名的体育收藏品:Steiner Sports
2020/07/31 全球购物
四川internet信息高速公路(C#)笔试题
2012/02/29 面试题
施工现场安全管理制度
2015/08/05 职场文书
详解Java实现设计模式之责任链模式
2021/06/23 Java/Android
Redis基本数据类型List常用操作命令
2022/06/01 Redis