图片无法加载

本教程的知识点为: 项目准备 项目准备 配置 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客户端 安装 使用。

全套笔记资料代码移步:  前往gitee仓库查看

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

全套教程部分目录:

图片无法加载

图片无法加载


部分文件图片:

图片无法加载

展示用户注册页面

创建用户模块子应用

1. 创建用户模块子应用

1.准备apps包,用于管理所有应用

图片无法加载

2.在apps包下创建应用users

$ cd ~/projects/meiduo_project/meiduo_mall/meiduo_mall/apps
$ python ../../manage.py startapp users
  • 1.
  • 2.

图片无法加载

2. 查看项目导包路径

重要提示:

  • 若要知道如何导入users应用并完成注册,需要知道项目导包路径

图片无法加载

已知导包路径

  • meiduo_project/meiduo_mall

已知 'users’应用所在目录

  • meiduo_project/meiduo_mall/meiduo_mall/apps/users

得到导入’users’应用的导包路径是:meiduo_mall/apps/users

3. 注册用户模块子应用
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'meiduo_mall.apps.users', # 用户模块应用
]
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

注册完users应用后,运行测试程序。

追加导包路径

思考:

  • 是否可以将注册users应用做的更加简便?
  • 按照如下形式,直接以应用名users注册
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'users', # 用户模块应用
]
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

分析:

  • 已知导包路径

    • meiduo_project/meiduo_mall
  • 已知’users’应用所在目录

    • meiduo_project/meiduo_mall/meiduo_mall/apps/users
  • 若要直接以应用名’users’注册

    • 需要一个导包路径:meiduo_project/meiduo_mall/meiduo_mall/apps

解决办法

* 追加导包路径:`meiduo_project/meiduo_mall/meiduo_mall/apps`
  • 1.
1. 追加导包路径

1.查看项目BASE_DIR

图片无法加载

2.追加导包路径

图片无法加载

图片无法加载

2. 重新注册用户模块应用
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'users', # 用户模块应用
]
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

重新注册完users应用后,运行测试程序。

3. 知识要点
  1. 查看导包路径

    • 通过查看导包路径,可以快速的知道项目中各个包该如何的导入。
    • 特别是接手老项目时,可以尽快的适应项目导包的方式。
  2. 追加导包路径

    • 通过追加导包路径,可以简化某些目录复杂的导包方式。

展示用户注册页面

1. 准备用户注册模板文件

图片无法加载

加载页面静态文件

<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>美多商城-注册</title>
    <link rel="stylesheet" type="text/css" href="{{ static('css/reset.css') }}">
    <link rel="stylesheet" type="text/css" href="{{ static('css/main.css') }}">
</head>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
2. 定义用户注册视图
class RegisterView(View):
    """用户注册"""

    def get(self, request):
        """
        提供注册界面
        :param request: 请求对象
        :return: 注册界面
        """
        return render(request, 'register.html')
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
3. 定义用户注册路由

1.总路由

urlpatterns = [
    # users
    url(r'^', include('users.urls', namespace='users')),
]
  • 1.
  • 2.
  • 3.
  • 4.

2.子路由

urlpatterns = [
    # 注册
    url(r'^register/$', views.RegisterView.as_view(), name='register'),
]
  • 1.
  • 2.
  • 3.
  • 4.

用户模型类

定义用户模型类

1. Django默认用户认证系统
  • Django自带用户认证系统

    • 它处理用户账号、组、权限以及基于cookie的用户会话。
  • Django认证系统位置

    • django.contrib.auth包含认证框架的核心和默认的模型。
    • django.contrib.contenttypes是Django内容类型系统,它允许权限与你创建的模型关联。
  • Django认证系统同时处理认证和授权

    • 认证:验证一个用户是否它声称的那个人,可用于账号登录。
    • 授权:授权决定一个通过了认证的用户被允许做什么。
  • Django认证系统包含的内容

    • 用户:用户模型类、用户认证。
    • 权限:标识一个用户是否可以做一个特定的任务,MIS系统常用到。
    • 组:对多个具有相同权限的用户进行统一管理,MIS系统常用到。
    • 密码:一个可配置的密码哈希系统,设置密码、密码校验。
2. Django默认用户模型类
  • Django认证系统中提供了用户模型类User保存用户的数据。

    • User对象是认证系统的核心。
  • Django认证系统用户模型类位置

    • django.contrib.auth.models.User

    图片无法加载

  • 父类AbstractUser介绍

    • User对象基本属性

      • 创建用户(注册用户)必选: username、password
      • 创建用户(注册用户)可选:email、first_name、last_name、last_login、date_joined、is_active 、is_staff、is_superuse
      • 判断用户是否通过认证(是否登录):is_authenticated
    • 创建用户(注册用户)的方法

    user = User.objects.create_user(username, email, password, **extra_fields)

    
    
    
    * 用户认证(用户登录)的方法
    ```python
    from django.contrib.auth import authenticate
    user = authenticate(username=username, password=password, **kwargs)
    
    • 1.
    • 2.
    • 3.
    • 4.
    • 5.
    • 6.
    • 7.
    • 处理密码的方法

      • 设置密码:set_password(raw_password)
      • 校验密码:check_password(raw_password)
    3. 自定义用户模型类

    思考:为什么要自定义用户模型类?

    • 观察注册界面会发现,美多商城注册数据必选用户mobile信息
    • 但是Django默认用户模型类中没有mobile字段,所以要自定义用户模型类。

    如何自定义用户模型类?

    • 继承自AbstractUser(可通过阅读Django默认用户模型类的源码得知) 。
    • 新增mobile字段。
    from django.db import models
    from django.contrib.auth.models import AbstractUser
    
      
      
    # Create your models here.
      
      
    
    
    class User(AbstractUser):
        """自定义用户模型类"""
        mobile = models.CharField(max_length=11, unique=True, verbose_name='手机号')
    
        class Meta:
            db_table = 'tb_users'
            verbose_name = '用户'
            verbose_name_plural = verbose_name
    
        def __str__(self):
            return self.username
    
    • 1.
    • 2.
    • 3.
    • 4.
    • 5.
    • 6.
    • 7.
    • 8.
    • 9.
    • 10.
    • 11.
    • 12.
    • 13.
    • 14.
    • 15.
    • 16.
    • 17.
    • 18.
    • 19.
    • 20.
    • 21.
    4. 知识要点
    1. Django自带用户认证系统核心就是User对象,并封装了一系列可用的方法和属性。
    2. Django用户认证系统包含了一系列对用户的操作,比如:模型类,认证,权限,分组,密码处理等。
    3. Django用户认证系统中的用户模型类可以自定义,继承自AbstractUser
    4. [Django用户认证系统说明文档](

    迁移用户模型类

    1. 指定用户模型类

    思考:为什么Django默认用户模型类是User?

    • 阅读源代码:‘django.conf.global_settings’
    AUTH_USER_MODEL = 'auth.User'
    
    • 1.

    结论:

    • Django用户模型类是通过全局配置项 AUTH_USER_MODEL 决定的

    配置规则:

    AUTH_USER_MODEL = '应用名.模型类名'
    
    • 1.
      
      
    # 指定本项目用户模型类
      
      
    AUTH_USER_MODEL = 'users.User'
    
    • 1.
    • 2.
    • 3.
    • 4.
    • 5.
    • 6.
    2. 迁移用户模型类

    1.创建迁移文件

    • python manage.py makemigrations

    图片无法加载

    2.执行迁移文件

    • python manage.py migrate

    图片无法加载

    3. 知识要点
    1. 用户认证系统中的用户模型类,是通过全局配置项 AUTH_USER_MODEL 决定的。
    2. 如果迁移自定义用户模型类,必须先配置 AUTH_USER_MODEL

    用户注册业务实现

    用户注册业务逻辑分析

    1. 用户注册业务逻辑分析

    图片无法加载

    用户注册接口设计和定义

    1. 设计接口基本思路
    • 对于接口的设计,我们要根据具体的业务逻辑,设计出适合业务逻辑的接口。

    • 设计接口的思路:

      • 分析要实现的业务逻辑:

        • 明确在这个业务中涉及到几个相关子业务。
        • 将每个子业务当做一个接口来设计。
      • 分析接口的功能任务,明确接口的访问方式与返回数据:

        • 请求方法(如GET、POST、PUT、DELETE等)。
        • 请求地址。
        • 请求参数(如路径参数、查询字符串、表单、JSON等)。
        • 响应数据(如HTML、JSON等)。
    2. 用户注册接口设计

    1.请求方式

    选项方案
    请求方法POST
    请求地址/register/

    2.请求参数:表单参数

    参数名类型是否必传说明
    usernamestring用户名
    passwordstring密码
    password2string确认密码
    mobilestring手机号
    sms_codestring短信验证码
    allowstring是否同意用户协议

    3.响应结果:HTML

    • register.html
    响应结果响应内容
    注册失败响应错误提示
    注册成功重定向到首页
    3. 用户注册接口定义

    1.注册视图

    class RegisterView(View):
        """用户注册"""
    
        def get(self, request):
            """
            提供注册界面
            :param request: 请求对象
            :return: 注册界面
            """
            return render(request, 'register.html')
    
        def post(self, request):
            """
            实现用户注册
            :param request: 请求对象
            :return: 注册结果
            """
            pass
    
    • 1.
    • 2.
    • 3.
    • 4.
    • 5.
    • 6.
    • 7.
    • 8.
    • 9.
    • 10.
    • 11.
    • 12.
    • 13.
    • 14.
    • 15.
    • 16.
    • 17.
    • 18.

    2.总路由

    urlpatterns = [
        # users
        url(r'^', include('users.urls', namespace='users')),
    ]
    
    • 1.
    • 2.
    • 3.
    • 4.

    3.子路由

    urlpatterns = [
        # 注册
        url(r'^register/$', views.RegisterView.as_view(), name='register'),
    ]
    
    • 1.
    • 2.
    • 3.
    • 4.