【Django开发】前后端分离django美多商城项目第7篇:登录,1. 互联开发者申请步骤【附代码文档】

举报
程序员一诺python 发表于 2024/08/27 21:35:42 2024/08/27
【摘要】 本教程的知识点为: 项目准备 项目准备 配置 1. 修改settings/dev.py 文件中的路径信息 2. INSTALLED_APPS 3. 数据库 用户部分 图片 1. 后端接口设计: 视图原型 2. 具体视图实现 用户部分 使用Celery完成发送 判断帐号是否存在 1. 判断用户名是否存在 后端接口设计: 用户部分 JWT 什么是JWT 起源 传统的session认

本教程的知识点为: 项目准备 项目准备 配置 1. 修改settings/dev.py 文件中的路径信息 2. INSTALLED_APPS 3. 数据库 用户部分 图片 1. 后端接口设计: 视图原型 2. 具体视图实现 用户部分 使用Celery完成发送 判断帐号是否存在 1. 判断用户名是否存在 后端接口设计: 用户部分 JWT 什么是JWT 起源 传统的session认证 用户部分 登录 1. 业务说明 2. 后端接口设计 3. 后端实现 登录 使用登录的流程 创建模型类 urllib使用说明 登录回调处理 登录 使用登录的流程 创建模型类 urllib使用说明 绑定用户身份接口 邮件与验证 学习目标: 业务说明: 技术说明: 保存邮箱并发送验证邮件 省市区地址查询 数据库建表 说明 页面静态化 注意 定时任务 安装 部分 详情页 异步任务的触发 。 后端接口设计 收货地址 使用缓存 安装 使用方法 为省市区视图添加缓存 数据库表设计 表结构 数据表结构 首页数据表结构 Docker使用 Docker简介 用户浏览历史记录 1. 保存 后端接口设计 后端实现 搜索 1. 需求分析 2. 搜索引擎原理 3. Elasticsearch 部分 业务需求分析 技术实现 数据存储设计 1. Redis保存已登录用户 商品部分 业务需求分析 技术实现 查询数据 1. 后端接口设计 部分 业务需求分析 技术实现 登录合并 修改登录视图 部分 保存 1. 后端接口设计 2. 后端实现 保存的思路 创建数据库模型类 接入 开发平台登录 沙箱环境 Xadmin 1. 安装 2. 使用 站点的全局配置 站点Model管理。 在Ubuntu中安装 2. 启动与停止 3. 镜像操作 端与自定义文件存储系统 1. 的Python客户端 安装 使用。

完整笔记资料代码:https://gitee.com/yinuo112/Backend/tree/master/Django/前后端分离django美多商城项目/note.md

感兴趣的小伙伴可以自取哦~


全套教程部分目录:


部分文件图片:

登录

登录开发文档

登录:即我们所说的第三方登录,是指用户可以不在本项目中输入密码,而直接通过第三方的验证,成功登录本项目。

1. 互联开发者申请步骤

若想实现登录,需要成为互联的开发者,审核通过才可实现。

  • 相关连接:[

2. 互联应用申请步骤

成为互联开发者后,还需创建应用,即获取本项目对应与互联的应用ID。

  • 相关连接:[

3. 网站对接登录步骤

互联提供有开发文档,帮助开发者实现登录。

  • 相关连接:[

4. 登录流程分析

图片无法加载

5. 知识要点

  1. 当我们在对接第三方平台的接口时,一定要认真阅读第三方平台提供的文档。文档中一定会有接口的使用说明,方便我们开发。

定义登录模型类

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

1. 定义模型类基类

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

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的表

2. 定义登录模型类

创建一个新的应用oauth,用来实现第三方认证登录。

# oauth


url(r'^oauth/', include('oauth.urls')),

oauth/models.py中定义身份(openid)与用户模型类User的关联关系

from django.db import models

from meiduo_mall.utils.models import BaseModel


# Create your models here.s




class OAuthUser(BaseModel):
    """登录用户数据"""
    user = models.ForeignKey('users.User', on_delete=models.CASCADE, verbose_name='用户')
    openid = models.C harField(max_length=64, verbose_name='openid', db_index=True)

    class Meta:
        db_table = 'tb_oauth_qq'
        verbose_name = '登录用户数据'
        verbose_name_plural = verbose_name

3. 迁移登录模型类

$ python manage.py makemigrations
$ python manage.py migrate

图片无法加载

登录工具LoginTool

1. LoginTool介绍

  • 该工具封装了登录时对接互联接口的请求操作。可用于快速实现登录。

2. LoginTool安装

pip install LoginTool

3. LoginTool使用说明

1.导入

from LoginTool.tool import OAuth

2.初始化OAuth对象

oauth = OAuth(client_id=settings._CLIENT_ID, client_secret=settings._CLIENT_SECRET, redirect_uri=settings._REDIRECT_URI, state=next)

3.获取登录扫码页面,扫码后得到Authorization Code

login_url = oauth.get_qq_url()

4.通过Authorization Code获取Access Token

access_token = oauth.get_access_token(code)

5.通过Access Token获取OpenID

openid = oauth.get_open_id(access_token)

OAuth2.0认证获取openid

待处理业务逻辑

# 提取code请求参数




# 使用code向服务器请求access_token




# 使用access_token向服务器请求openid




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




# 如果openid已绑定美多商城用户,直接生成JWT token,并返回




# 如果openid没绑定美多商城用户,创建用户并绑定到openid

1. 获取登录扫码页面

1.请求方式

选项 方案
请求方法 GET
请求地址 /qq/login/
>
2.请求参数:查询参数
参数名 类型 是否必传 说明
next string 用于记录登录成功后进入的网址
>
3.响应结果:JSON
字段 说明
code 状态码
errmsg 错误信息
login_url 登录扫码页面链接
>
4.后端逻辑实现
class AuthURLView(View):
    """提供登录页面网址

    """
    def get(self, request):
        # next表示从哪个页面进入到的登录页面,将来登录成功后,就自动回到那个页面
        next = request.GET.get('next')

        # 获取登录页面网址
        oauth = OAuth(client_id=settings._CLIENT_ID, client_secret=settings._CLIENT_SECRET, redirect_uri=settings._REDIRECT_URI, state=next)
        login_url = oauth.get_qq_url()

        return http.JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK', 'login_url':login_url})

5.登录参数

_CLIENT_ID = '101518219'
_CLIENT_SECRET = '418d84ebdc7241efb79536886ae95224'
_REDIRECT_URI = '

2. 接收Authorization Code

提示:

  • 用户在登录成功后,会将用户重定向到我们配置的回调网址。
  • 在重定向到回调网址时,会传给我们一个Authorization Code
  • 我们需要拿到Authorization Code完成OAuth2.0认证获取openid
  • 在本项目中,我们申请登录开发资质时配置的回调网址为:

  • `

  • 互联重定向的完整网址为:

  • `

class AuthUserView(View):
    """用户扫码登录的回调处理"""

    def get(self, request):
        """Oauth2.0认证"""
        # 接收Authorization Code
        code = request.GET.get('code')
        if not code:
            return http.HttpResponseForbidden('缺少code')
        pass
url(r'^oauth_callback/$', views.AuthUserView.as_view()),

3. OAuth2.0认证获取openid

  1. 使用code向服务器请求access_token
  2. 使用access_token向服务器请求openid
class AuthUserView(View):
    """用户扫码登录的回调处理"""

    def get(self, request):
        """Oauth2.0认证"""
        # 提取code请求参数
        code = request.GET.get('code')
        if not code:
            return http.HttpResponseForbidden('缺少code')

        # 创建工具对象
        oauth = OAuth(client_id=settings._CLIENT_ID, client_secret=settings._CLIENT_SECRET, redirect_uri=settings._REDIRECT_URI)

        try:
            # 使用code向服务器请求access_token
            access_token = oauth.get_access_token(code)

            # 使用access_token向服务器请求openid
            openid = oauth.get_open_id(access_token)
        except Exception as e:
            logger.error(e)
            return http.HttpResponseServerError('OAuth2.0认证失败')
        pass

4. 本机绑定www.meiduo.site域名

1.ubuntu系统或者Mac系统

编辑 /etc/hosts

2.Windows系统

编辑 C:\Windows\System32\drivers\etc\hosts

openid是否绑定用户的处理

1. 判断openid是否绑定过用户

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

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

2. openid已绑定用户的处理

如果openid已绑定美多商城用户,直接生成状态保持信息,登录成功,并重定向到首页。

try:
    oauth_user = OAuthUser.objects.get(openid=openid)
except OAuthUser.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

3. openid未绑定用户的处理

  • 为了能够在后续的绑定用户操作中前端可以使用openid,在这里将openid签名后响应给前端。
  • openid属于用户的隐私信息,所以需要将openid签名处理,避免暴露。
try:
    oauth_user = OAuthUser.objects.get(openid=openid)
except OAuthUser.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 }}">

4. 补充itsdangerous的使用

  • itsdangerous模块的参考资料链接 [
  • 安装:pip install itsdangerous

  • TimedJSONWebSignatureSerializer的使用

  • 使用TimedJSONWebSignatureSerializer可以生成带有有效期token

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': '18512345678'})
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 ```python def generate_eccess_token(openid): """ 签名openid :param openid: 用户的openid :return: access_token """ serializer = Serializer(settings.SECRET_KEY, expires_in
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。