若想实现QQ登录,需要成为QQ互联的开发者,审核通过才可实现
第一步:首先使用qq登录
第二步:注册个人应用
注册成功后如下
成为QQ互联开发者后,还需创建应用,即获取本项目对应与QQ互联的应用ID。
相关连接:https://connect.qq.com/manage.html#/appcreate/web
QQ互联提供有开发文档,帮助开发者实现QQ登录。
相关连接:http://wiki.connect.qq.com/%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C_oauth2-0
from django.db import models
class BaseModel(models.Model):
"""为模型类补充字段"""
create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")
class Meta:
abstract = True # 说明是抽象模型类, 用于继承使用,数据库迁移时不会创建BaseModel的表
from django.db import models
from utils.models import BaseModel
class OAuthQQUser(BaseModel):
"""QQ登录用户数据"""
# ForeignKey 我们使用了 其他子应用的模型
# 我们采用 '子应用名.模型类名'
user = models.ForeignKey('users.User', on_delete=models.CASCADE, verbose_name='用户')
openid = models.CharField(max_length=64, verbose_name='openid', db_index=True)
class Meta:
db_table = 'tb_oauth_qq'
verbose_name = 'QQ登录用户数据'
verbose_name_plural = verbose_name
# Application references
# https://docs.djangoproject.com/en/2.1/ref/settings/#std:setting-INSTALLED_APPS
INSTALLED_APPS = [
'app',
# Add your apps here to enable them
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app.users',
'app.oauth',
]
# QQ登陆相关的
QQ_CLIENT_ID = '填写自己的'
QQ_CLIENT_SECRET = '填写自己的'
QQ_REDIRECT_URI = '填写自己的'
from django.shortcuts import render
from QQLoginTool.QQtool import OAuthQQ
from DJ_MeiDuo import settings
from django import http
from django.views import View
# Create your views here.
class OauthQQURLView(View):
def get(self,request):
#1.创建实例对象
state = 'test'
qqoauth = OAuthQQ(
client_secret=settings.QQ_CLIENT_SECRET,
client_id=settings.QQ_CLIENT_ID,
redirect_uri=settings.QQ_REDIRECT_URI,
state=state
)
#2.调用方法
login_url = qqoauth.get_qq_url()
return http.JsonResponse({'login_url':login_url})
class OauthQQUserView(View):
def get(self,request):
# 1.获取code
code = request.GET.get('code')
if code is None:
return render(request,'oauth_callback.html',context={'errmsg':'没有获取到指定参数'})
# 2. 通过读取文档将code转换为token
qqoauth = OAuthQQ(
client_secret=settings.QQ_CLIENT_SECRET,
client_id=settings.QQ_CLIENT_ID,
redirect_uri=settings.QQ_REDIRECT_URI
)
token = qqoauth.get_access_token(code)
#3.通过token换取openid
openid = qqoauth.get_open_id(token)
# 4. 我们需要根据 openid 进行数据的查询
try:
qquser = OAuthQQUser.objects.get(openid=openid)
except OAuthQQUser.DoesNotExist:
# 如果没有同样的openid,则说明用户没有绑定过
# 对openid进行一个加密的处理
openid_access_token = generate_access_token(openid)
return render(request,'oauth_callback.html',context={'openid_access_token':openid_access_token})
else:
# 如果有同样的openid,则说明用户绑定过
# 则直接登陆
response = redirect(reverse('contents:index'))
#1. 设置登陆状态
login(request,qquser.user)
#2.设置cookie信息
response.set_cookie('username',qquser.user.username,max_age=14*24*3600)
return response
# return render(request,'oauth_callback.html')