python编程快速上手(持续更新中…)
python实战项目(Django技术点)
1、业务分析
2、OAuth2.0认证获取openid(settings)
# QQ登录参数# 我们申请的 客户端id
QQ_CLIENT_ID = '101474184'# 我们申请的 客户端秘钥
QQ_CLIENT_SECRET = 'c6ce949e04e12ecc909ae6a8b09b637c'# 我们申请时添加的: 登录成功后回调的路径
QQ_REDIRECT_URI = 'http://www.meiduo.site:8080/oauth_callback.html'
3、步骤
生成用户绑定链接->获取code->获取token->获取openid->保存openid
A/QQLoginTool安装
pip install QQLoginTool
B/生产用户绑定链接
from django.views import View
from QQLoginTool.QQtool import OAuthQQ
from meiduo_mall import settings
from django.http import JsonResponse
class QQLoginURLView(View):
def get(self, request):
# 1. 生成 QQLoginTool 实例对象
# client_id=None, appid
# client_secret=None, appsecret
# redirect_uri=None, 用户同意登录之后,跳转的页面
# state=None 不知道什么意思,随便写。等出了问题再分析问题
qq = OAuthQQ(client_id=settings.QQ_CLIENT_ID,
client_secret=settings.QQ_CLIENT_SECRET,
redirect_uri=settings.QQ_REDIRECT_URI,
state='xxxxx')
# 2. 调用对象的方法生成跳转链接
qq_login_url = qq.get_qq_url()
# 3. 返回响应
return JsonResponse({'code': 0, 'errmsg': 'ok', 'login_url': qq_login_url})
C/获取openid
D/保存绑定信息
E/代码实现
def post(self, request):
# 1. 接收请求
data = json.loads(request.body.decode())
# 2. 获取请求参数 openid
mobile = data.get('mobile')
password = data.get('password')
sms_code = data.get('sms_code')
openid = data.get('access_token')
# 需要对数据进行验证(省略)
# 添加对 access-token 解密
# from apps.oauth.utils import check_access_token
# openid = check_access_token(access_token)
if openid is None:
return JsonResponse({'code': 400, 'errmsg': '参数缺失'})
# 3. 根据手机号进行用户信息的查询
try:
user = User.objects.get(mobile=mobile)
except User.DoesNotExist:
# 手机号不存在
# 5. 查询到用户手机号没有注册。我们就创建一个user信息。然后再绑定
user = User.objects.create_user(username=mobile, mobile=mobile, password=password)
else:
# 手机号存在
# 4. 查询到用户手机号已经注册了。判断密码是否正确。密码正确就可以直接保存(绑定) 用户和openid信息
if not user.check_password(password):
return JsonResponse({'code': 400, 'errmsg': '账号或密码错误'})
OAuthQQUser.objects.create(user=user, openid=openid)
# 6. 完成状态保持
login(request, user)
# 7. 返回响应
response = JsonResponse({'code': 0, 'errmsg': 'ok'})
response.set_cookie('username', user.username)
return response