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 相关文章推荐
wxpython 学习笔记 第一天
Feb 09 Python
python实现的简单文本类游戏实例
Apr 28 Python
Python中subprocess模块用法实例详解
May 20 Python
python matplotlib中文显示参数设置解析
Dec 15 Python
Python爬虫爬取一个网页上的图片地址实例代码
Jan 16 Python
python tkinter图形界面代码统计工具
Sep 18 Python
浅析python,PyCharm,Anaconda三者之间的关系
Nov 27 Python
Python+OpenCV实现旋转文本校正方式
Jan 09 Python
python对象销毁实例(垃圾回收)
Jan 16 Python
python实现可下载音乐的音乐播放器
Feb 25 Python
在django中实现choices字段获取对应字段值
Jul 12 Python
解决Pytorch中关于model.eval的问题
May 22 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/30 PHP
php汉字转拼音的示例
2014/02/27 PHP
Zend Framework基本页面布局分析
2016/03/19 PHP
javascript新手语法小结
2008/06/15 Javascript
基于jQuery的表格操作插件
2010/04/22 Javascript
asp.net下使用jquery 的ajax+WebService+json 实现无刷新取后台值的实现代码
2010/09/19 Javascript
JavaScript 高级篇之函数 (四)
2012/04/07 Javascript
浅析ajax请求json数据并用js解析(示例分析)
2013/07/13 Javascript
JavaScript中遍历对象的property的3种方法介绍
2014/12/30 Javascript
jQuery CSS3相结合实现时钟插件
2016/01/08 Javascript
基于jquery实现无限级树形菜单
2016/03/22 Javascript
Javascript操作表单实例讲解(下)
2016/06/20 Javascript
jquery实现瀑布流效果 jquery下拉加载新数据
2016/12/12 Javascript
Angular.js实现多个checkbox只能选择一个的方法示例
2017/02/24 Javascript
关于Mac下安装nodejs、npm和cnpm的教程
2018/04/11 NodeJs
node.js 模块和其下载资源的镜像设置的方法
2018/09/06 Javascript
vue-cli 3.x配置跨域代理的实现方法
2019/04/12 Javascript
Vue项目中如何使用Axios封装http请求详解
2019/10/23 Javascript
基于form-data请求格式详解
2019/10/29 Javascript
JS如何实现在弹出窗口中加载页面
2020/12/03 Javascript
python翻译软件实现代码(使用google api完成)
2013/11/26 Python
python爬取哈尔滨天气信息
2018/07/14 Python
使用memory_profiler监测python代码运行时内存消耗方法
2018/12/03 Python
Django 重写用户模型的实现
2019/07/29 Python
python切片(获取一个子列表(数组))详解
2019/08/09 Python
详解python常用命令行选项与环境变量
2020/02/20 Python
Giglio英国站:意大利奢侈品购物网
2018/03/06 全球购物
我的五年职业生涯规划
2014/01/23 职场文书
工程技术员岗位职责
2014/03/02 职场文书
新闻专业毕业生英文求职信
2014/03/19 职场文书
初中优秀班集体申报材料
2014/05/01 职场文书
企业文化宣传标语
2014/06/09 职场文书
食品安全演讲稿
2014/09/01 职场文书
二人合伙经营协议书
2014/09/13 职场文书
学院党的群众路线教育实践活动整改方案
2014/10/04 职场文书
文明礼仪倡议书
2015/04/28 职场文书