91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Django項目中實現第三方登錄功能

發布時間:2021-03-11 17:14:55 來源:億速云 閱讀:252 作者:Leah 欄目:開發技術

怎么在Django項目中實現第三方登錄功能?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

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" > &raquo; QQ登錄</a>

3,在項目的應用下創建utils文件夾并創建function.py用于封裝函數,封裝的函數用于從返回數據中提取openid(騰訊公司數據庫里面的用戶id)

怎么在Django項目中實現第三方登錄功能

封裝的函數內容如下;

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/oauth3.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/oauth3.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/oauth3.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項目中實現第三方登錄功能

看完上述內容,你們掌握怎么在Django項目中實現第三方登錄功能的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

怀宁县| 石嘴山市| 安泽县| 松江区| 晋城| 北川| 东安县| 正镶白旗| 津市市| 镇坪县| 上林县| 阿城市| 贵南县| 盘山县| 天峻县| 鄂尔多斯市| 扶沟县| 遵义县| 灵武市| 白山市| 张家口市| 苍南县| 长乐市| 临沭县| 潞西市| 克拉玛依市| 昭苏县| 佛学| 阳泉市| 平江县| 绩溪县| 保德县| 伊吾县| 进贤县| 都兰县| 封丘县| 石楼县| 建始县| 清徐县| 济源市| 庆阳市|