Python web全栈开发_Django_billshop商城_定义QQ登录模型类、QQ登录-提供扫码登录页面、根据openid判断用户是否绑定 & 签名&展示绑定页面 & openid绑定用户实现

本文介绍了如何在Django项目中实现QQ登录功能,包括定义QQ登录模型类、提供扫码登录页面、根据openid判断用户是否已绑定并实现openid与用户的绑定。在过程中涉及MySQL数据库、视图View、路由配置、域名绑定及itsdangerous库的使用来确保openid的安全性。

1-定义QQ登录模型类

QQ登录成功后,我们需要将QQ用户和商场用户关联到一起,方便下次QQ登录时使用,所以我们选择使用MySQL数据库进行存储。

定义模型类基类
为了给项目中模型类补充数据创建时间和更新时间两个字段,我们需要定义模型类基类。 在billshop.utils/models.py文件中创建模型类基类。

定义QQ登录模型类
创建一个新的应用oauth,用来实现QQ第三方认证登录

在这里插入图片描述
把基类单独抽离到utils ,其他应用可能也要用到, 所以, 这块抽离后,直接导入即可。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

现在映射一下数据库:
在这里插入图片描述
因为没有注册,所以没有任何改变, 于是,dev注册app, 保存,重启项目后,映射

在这里插入图片描述
在这里插入图片描述
如果映射时出现外报错“cannot add foreign key constraint” , 请检查相关的表, 查看引擎是否是MyISAM(不支持外键),所以一直推荐大家,在数据库开始就要把引擎设置 InnoDB。

2-QQ登录-提供扫码登录页面

step1 定义View视图
在这里插入图片描述

step 2
子路由在这里插入图片描述

step3 总路由

在这里插入图片描述
看到现在的效果
在这里插入图片描述
虽然上面正常,但是应该把回调地址添加一下:
在这里插入图片描述
然后报错:
在这里插入图片描述
于是, 把127.0.0.1 再次添加
在这里插入图片描述
ok了
在这里插入图片描述
如果因为后端没有业务逻辑, 点上去又报错 4040,则需要将域名绑定先。

本机绑定www.meiduo.site域名
Windows系统
编辑 C:\Windows\System32\drivers\etc\hosts

ubuntu系统或者Mac系统
编辑 /etc/hosts
因为www.meiduo.site 是将来要发布的域名,所以,不可能改变它,于是改变自己的local, 做映射即可。
我改好了,
在这里插入图片描述
现在用meiduo 已经可以取代本机本地域名了。
在这里插入图片描述

3-QQ登录-根据openid判断用户是否绑定 & 签名&展示绑定页面 & openid绑定用户实现

在这里插入图片描述
判断openid是否绑定过用户

使用openid查询该QQ用户是否在商城中绑定过用户

try:
    oauth_user = OAuthQQUser.objects.get(openid=openid)
except OAuthQQUser.DoesNotExist:
    # 如果openid没绑定商城用户
    pass
else:
    # 如果openid已绑定商城用户
    pass

openid已绑定用户的处理

try:
    oauth_user = OAuthQQUser.objects.get(openid=openid)
except OAuthQQUser.DoesNotExist:
    # 如果openid没绑定商城用户
    pass
else:
    # 如果openid已绑定商城用户
    # 实现状态保持
    qq_user = oauth_user.user
    login(request, qq_user)
    # 响应结果
    next = request.GET.get('state')
    response = redirect(next)
    # 登录时用户名写入到cookie,有效期15天
    response.set_cookie('username', qq_user.username, max_age=3600 * 24 * 15)
    return response

openid未绑定用户的处理
为了能够在后续的绑定用户操作中前端可以使用openid,在这里将openid签名后响应给前端。
openid属于用户的隐私信息,所以需要将openid签名处理,避免暴露。

try:
    oauth_user = OAuthQQUser.objects.get(openid=openid)
except OAuthQQUser.DoesNotExist:
    # 如果openid没绑定商城用户
    access_token = generate_eccess_token(openid)
    context = {'access_token': access_token}
    return render(request, 'oauth_callback.html', context)
else:
    # 如果openid已绑定商城用户
    # 实现状态保持
    qq_user = oauth_user.user
    login(request, qq_user)
    # 重定向到主页
    response = redirect(reverse('contents:index'))
    # 登录时用户名写入到cookie,有效期15天
    response.set_cookie('username', qq_user.username, max_age=3600 * 24 * 15)
    return response

oauth_callback.html中渲染access_token

<input v-model="access_token" type="hidden" name="access_token" value="{{ access_token }}">

补充itsdangerous的使用
• itsdangerous模块的参考资料链接 http://itsdangerous.readthedocs.io/en/latest/
• 安装:pip install itsdangerous
顺便 pip install ipython -i https://pypi.douban.com/simple
在这里插入图片描述



**• TimedJSONWebSignatureSerializer的使用**

```python
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from django.conf import settings
# serializer = Serializer(秘钥, 有效期秒)
serializer = Serializer(settings.SECRET_KEY, 300)
# serializer.dumps(数据), 返回bytes类型
token = serializer.dumps({'mobile': '185xxxxxxx78'})
token = token.decode()
# 检验token
# 验证失败,会抛出itsdangerous.BadData异常
serializer = Serializer(settings.SECRET_KEY, 300)
try:
    data = serializer.loads(token)
except BadData:
    return None

补充:openid签名处理
• oauth.utils.py

def generate_access_token(openid):
    """
    签名openid
    :param openid: 用户的openid
    :return: access_token
    """
    serializer = Serializer(settings.SECRET_KEY, expires_in=constants.ACCESS_TOKEN_EXPIRES)
    data = {'openid': openid}
    token = serializer.dumps(data)
    return token.decode()

加密 解密 过程演示
在这里插入图片描述
所以在oauth 下建一个utils文件, 根据上述思路加密
后续openid 时效设置了600秒。

完成所有配置和脚本后, 全部实现了短信注册和QQ扫码授权登录的功能。
绑定的用户信息也和user中的id 外键对应了。
在这里插入图片描述

本资源面向&ldquo;一带一路&rdquo;专题研究,提供 中巴经济走廊(CPEC)空间范围矢量边界 及其 1 km 分辨率 DEM 高程数据。数据包含可直接使用的 Shapefile、可编辑的 ArcMap MXD 工程文件,以及经过专业制图渲染的标准成图 TIF,可满足科研分析、规划设计、区域发展评估和可视化展示等多场景需求。数据内容构成1. 中巴经济走廊矢量边界(中巴经济走廊.shp)精确 delineation CPEC 的整体空间范围,覆盖中巴交通通道、关键节点城市及沿线经济带区域。矢量边界经过人工校对与拓扑检查,确保边界连续、无缝隙且可直接用于空间分析。2. 1 km 分辨率 DEM(中巴经济走廊1kmDEM.tif)数据源自权威球地形产品,并针对 CPEC 区域进行裁剪、滤波与重新投影处理。表示区域高程变化特征,可用于坡度、坡向、地形起伏度及地貌分区的进一步分析。栅格单位为米,空间参考系统统一为 WGS84。3. 可编辑 ArcMap MXD 工程文件(中巴经济走廊.mxd)包含预设的 DEM 阴影渲染、高程色带、图例、比例尺和指北针。CPEC 边界已设置高亮边框与标注,方便直接生成地图或自定义样式。博主用 ArcMap 10.8 系列版本打开与编辑。4. 标准成图 TIF(中巴经济走廊标准成图.tif)为已排版好的正式地图,含图廓、图例与标注,可直接用于论文、报告及展示。分辨率高,适合打印与电子版发布。技术特点与制作流程数据处理流程包含:边界矢量融合 &rarr; 投影统一 &rarr; DEM 裁剪与重采样 &rarr; 地形渲染 &rarr; 制图排版。拓扑检查:删除重复线段、重叠多边形及缝隙,确保空间数据质量可靠。DEM 处理:采用降噪与坡度增强技术,使地形层次更为清晰。适用于&ldquo;一带一路&rdquo;建设、区域基础设施规划,地貌分析与生态评估,跨国区域地缘经济分析等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值