教程总体简介:美多商城 商业模式介绍 1.B2B--企业对企业 2.C2C--个人对个人 5.O2O--线上到线下 开发流程 说明: 需求分析 1. 用户部分 注册 登录 个人信息 地址管理 修改密码 3. 购物车部分 购物车管理 项目架构 创建工程 1. 在git平台创建工程 2. 添加前端文件 合并 3. 创建Django REST framework工程 4. 修改manage.py 5. 创建数据库 收货地址 省市区地址查询 数据库建表 后端接口设计 前端 使用缓存 安装 使用方法 为省市区视图添加缓存 缓存数据保存位置与有效期的设置 用户地址管理代码 后端 商品部分 数据库表设计 表结构 数据库模型类 FastDFS分布式文件系统 1. 什么是FastDFS 2. 文件上传流程 Docker使用 安装与操作 1. 在Ubuntu中安装Docker 2. 启动与停止 3. Docker镜像操作 5. 将容器保存为镜像 6. 镜像备份与迁移 使用Docker安装FastDFS 1. 获取镜像 2. 运行tracker 3. 运行storage CKEditor富文本编辑器 1. 安装 3. 添加CKEditor设置 5. 为模型类添加字段 6. 修改Bug 添加测试数据 在admin中注册模型类 添加FastDFS保存的测试图片数据 添加对应的数据库测试数据 页面静态化 注意 定时任务 添加应用 设置任务的定时时间 静态化首页的手动脚本 商品详情页 异步任务的触发 脚本工具 用户浏览历史记录 2. 查看 商品搜索 2. 搜索引擎原理 3. Elasticsearch 4. 使用Docker安装Elasticsearch及其扩展 6. 前端 项目准备 配置 1. 修改settings/dev.py 文件中的路径信息 2. INSTALLED_APPS 4. Redis 5. 本地化语言与时区 7. 异常处理 用户模型类 Django用户模型类 创建自定义的用户模型类 购物车数据存储设计 1. Redis保存已登录用户 添加到购物车 2. 后端实现 查询购物车数据 登录合并购物车 修改登录视图 订单结算 订单部分 保存订单 4. 使用乐观锁改写下单逻辑 5. 需要修改MySQL的事务隔离级别 下单成功页面 前端文件 沙箱环境 电脑网站支付流程 接入步骤 配置秘钥 发起支付 保存支付结果 Xadmin 用户权限控制 数据库读写分离 MySQL主从同步 1. 主从同步的定义 3. 配置主从同步的基本步骤 4. 详细配置主从同步的方法 配置Django实现数据库读写分离 2. 创建数据库操作的路由分发类 部署 1. 静态文件 2. 动态接口 图片验证码 3. 设置域名 4. 前端Vue代码: 跨域CORS 使用Celery完成发送短信 判断帐号是否存在 1. 判断用户名是否存在 JWT 什么是JWT 起源 传统的session认证 基于token的鉴权机制 JWT长什么样? JWT的构成 header playload signature 如何应用 urllib使用说明 绑定用户身份接口 用户中心个人信息 邮件与验证 使用Django发送邮件 保存邮箱并发送验证邮件 验证邮箱链接

完整笔记资料代码:https://gitee.com/yinuo112/Backend/tree/master/Django/django美多商城项目完整开发4.0/note.md

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


全套教程部分目录:


部分文件图片:

项目准备

配置

1. 修改settings/dev.py 文件中的路径信息

我们将Django的应用放到了 工程目录/meiduo_mall/apps目录下,如果创建一个应用,比如users,那么在配置文件的INSTALLED_APPS中注册应用应该如下:

1
2
3
4
INSTALLED_APPS = [...'meiduo_mall.apps.users.apps.UsersConfig',
]

为了还能像如下方式简便的注册引用,我们需要向Python解释器的导包路径中添加apps应用目录的路径。

1
2
3
4
INSTALLED_APPS = [...'users.apps.UsersConfig',
]

我们将配置文件改为放在settings子目录下,所以 配置文件中的BASE_DIR指向的变为了meiduo/meiduo_mall/meiduo_mall

使用sys.path添加<BASE_DIR>/apps目录,即可添加apps应用的导包路径。

1
2
3
4
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))# 添加导包路径import sys
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))

2. INSTALLED_APPS

在INSTALLED_APPS中添加rest_framework

1
2
3
4
INSTALLED_APPS = [...'rest_framework',
]

3. 数据库

1
2
3
4
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','HOST': '127.0.0.1',  # 数据库主机'PORT': 3306,  # 数据库端口'USER': 'meiduo',  # 数据库用户名'PASSWORD': 'meiduo',  # 数据库用户密码'NAME': 'meiduo_mall'  # 数据库名字}
}

注意:

记得在meiduo/meiduo_mall/__init__.py文件中添加

1
2
3
4
import pymysqlpymysql.install_as_MySQLdb()

4. Redis

安装django-redis,并配置

1
2
3
4
CACHES = {"default": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://10.211.55.5:6379/0","OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient",}},"session": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://10.211.55.5:6379/1","OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient",}}
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "session"

除了名为default的redis配置外,还补充了名为session的redis配置,分别使用两个不同的redis库。

同时修改了Django的Session机制使用redis保存,且使用名为'session'的redis配置。

此处修改Django的Session机制存储主要是为了给Admin站点使用。

**关于django-redis 的使用,说明文档可见[

5. 本地化语言与时区

1
2
3
4
LANGUAGE_CODE = 'zh-hans'TIME_ZONE = 'Asia/Shanghai'

6. 日志

1
2
3
4
LOGGING = {'version': 1,'disable_existing_loggers': False,  # 是否禁用已经存在的日志器'formatters': {  # 日志信息显示的格式'verbose': {'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'},'simple': {'format': '%(levelname)s %(module)s %(lineno)d %(message)s'},},'filters': {  # 对日志进行过滤'require_debug_true': {  # django在debug模式下才输出日志'()': 'django.utils.log.RequireDebugTrue',},},'handlers': {  # 日志处理方法'console': {  # 向终端中输出日志'level': 'DEBUG','filters': ['require_debug_true'],'class': 'logging.StreamHandler','formatter': 'simple'},'file': {  # 向文件中输出日志'level': 'INFO','class': 'logging.handlers.RotatingFileHandler','filename': os.path.join(os.path.dirname(BASE_DIR), "logs/meiduo.log"),  # 日志文件的位置'maxBytes': 300 * 1024 * 1024,'backupCount': 10,'formatter': 'verbose'},},'loggers': {  # 日志器'django': {  # 定义了一个名为django的日志器'handlers': ['console', 'file'],  # 可以同时向终端与文件中输出日志'propagate': True,  # 是否继续传递日志信息'level': 'DEBUG',  # 日志器接收的最低日志级别},}
}

7. 异常处理

修改Django REST framework的默认异常处理方法,补充处理数据库异常和Redis异常。

新建utils/exceptions.py

1
2
3
4
from rest_framework.views import exception_handler as drf_exception_handler
import logging
from django.db import DatabaseError
from redis.exceptions import RedisError
from rest_framework.response import Response
from rest_framework import status# 获取在配置文件中定义的logger,用来记录日志logger = logging.getLogger('django')def exception_handler(exc, context):
    """
    自定义异常处理
    :param exc: 异常
    :param context: 抛出异常的上下文
    :return: Response响应对象
    """# 调用drf框架原生的异常处理方法response = drf_exception_handler(exc, context)if response is None:view = context['view']if isinstance(exc, DatabaseError) or isinstance(exc, RedisError):# 数据库异常logger.error('[%s] %s' % (view, exc))response = Response({'message': '服务器内部错误'}, status=status.HTTP_507_INSUFFICIENT_STORAGE)return response

配置文件中添加

1
2
3
4
REST_FRAMEWORK = {# 异常处理'EXCEPTION_HANDLER': 'meiduo_mall.utils.exceptions.exception_handler',
}

项目准备

用户模型类

Django提供了认证系统,文档资料可参考此链接[

Django认证系统同时处理认证和授权。简单地讲,认证验证一个用户是否它们声称的那个人,授权决定一个通过了认证的用户被允许做什么。 这里的词语“认证”同时指代这两项任务,即Django的认证系统同时提供了认证机制和权限机制。

Django的认证系统包含:

  • 用户
  • 权限:二元(是/否)标志指示一个用户是否可以做一个特定的任务。
  • 组:对多个用户运用标签和权限的一种通用的方式。
  • 一个可配置的密码哈希系统
  • 用户登录或内容显示的表单和视图
  • 一个可插拔的后台系统

Django默认提供的认证系统中,用户的认证机制依赖Session机制,我们在本项目中将引入JWT认证机制,将用户的身份凭据存放在Token中,然后对接Django的认证系统,帮助我们来实现:

  • 用户的数据模型
  • 用户密码的加密与验证
  • 用户的权限系统

Django用户模型类

Django认证系统中提供了用户模型类User保存用户的数据,默认的User包含以下常见的基本字段:

  • username

必选。 150个字符以内。 用户名可能包含字母数字,_@+ .-个字符。在Django更改1.10:max_length从30个字符增加到150个字符。

  • first_name

可选(blank=True)。 少于等于30个字符。

  • last_name

可选(blank=True)。 少于等于30个字符。

  • email

可选(blank=True)。 邮箱地址。

  • password

必选。 密码的哈希及元数据。 (Django 不保存原始密码)。 原始密码可以无限长而且可以包含任意字符。

  • groups

Group 之间的多对多关系。

  • user_permissions

Permission 之间的多对多关系。

  • is_staff

布尔值。 指示用户是否可以访问Admin 站点。

  • is_active

布尔值。 指示用户的账号是否激活。 我们建议您将此标志设置为False而不是删除帐户;这样,如果您的应用程序对用户有任何外键,则外键不会中断。它不是用来控制用户是否能够登录。 在Django更改1.10:在旧版本中,默认is_active为False不能进行登录。

  • is_superuser

布尔值。 指定这个用户拥有所有的权限而不需要给他们分配明确的权限。

  • last_login

用户最后一次登录的时间。

  • date_joined

账户创建的时间。 当账号创建时,默认设置为当前的date/time。

常用方法:
  • set_password(raw_password)

设置用户的密码为给定的原始字符串,并负责密码的。 不会保存User 对象。当Noneraw_password 时,密码将设置为一个不可用的密码。

  • check_password(raw_password)

如果给定的raw_password是用户的真实密码,则返回True,可以在校验用户密码时使用。

管理器方法:

管理器方法即可以通过User.objects. 进行调用的方法。

  • create_user(username, email=None, password=None, **extra_fields)

创建、保存并返回一个User对象。

  • create_superuser(username, email, password, **extra_fields)

create_user() 相同,但是设置is_staffis_superuserTrue

创建自定义的用户模型类

Django认证系统中提供的用户模型类及方法很方便,我们可以使用这个模型类,但是字段有些无法满足项目需求,如本项目中需要保存用户的号,需要给模型类添加额外的字段。

Django提供了django.contrib.auth.models.AbstractUser用户抽象模型类允许我们继承,扩展字段来使用Django认证系统的用户模型类。

我们现在在meiduo/meiduo_mall/apps中创建Django应用users,并在配置文件中注册users应用。

在创建好的应用models.py中定义用户的用户模型类。

1
2
3
4
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

我们自定义的用户模型类还不能直接被Django的认证系统所识别,需要在配置文件中告知Django认证系统使用我们自定义的模型类。

在配置文件中进行设置

1
2
3
4
AUTH_USER_MODEL = 'users.User'

AUTH_USER_MODEL 参数的设置以点.来分隔,表示应用名.模型类名

注意:Django建议我们对于AUTH_USER_MODEL参数的设置一定要在第一次数据库迁移之前就设置好,否则后续使用可能出现未知错误。

执行数据库迁移

1
2
3
4
python manage.py makemigrations
python manage.py migrate

注册

创建好用户模型类后,我们开始来实现第一个业务逻辑——用户注册。

设计接口的思路

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

  • 接口的请求方式,如GET 、POST 、PUT等

  • 接口的URL路径定义
  • 需要前端传递的数据及数据格式(如路径参数、查询字符串、请求体表单、JSON等)
  • 返回给前端的数据及数据格式

在前后端分离的应用模式中,我们作为后端开发人员设计后端接口时,可以不用考虑返回给前端数据后,前端如何处理,这是前端开发人员的工作,我们只需明确我们要保存的或者要返回的是什么数据即可。

明确上述每一点后,即可开始编写接口。

注册业务接口分析

在用户注册中,需要实现以下接口:

  • 图片验证码
  • 短信验证码
  • 用户名判断是否存在
  • 号判断是否存在
  • 注册保存用户数据

图片验证码、短信验证码考虑到后续可能会在其他业务中也用到,因此我们将图片验证码独立,创建一个新应用verifications,在此应用中实现图片验证码、短信验证码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/910276.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/910276.shtml
英文地址,请注明出处:http://en.pswp.cn/news/910276.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于 OpenCV 的图像亮度、对比度与锐度调节

图像亮度、对比度和锐度是图像质量感知的重要参数&#xff0c;调节这些属性常用于图像增强、图像美化或图像分析的预处理阶段。本文将基于 OpenCV 实现这三项基础图像处理功能&#xff0c;并提供滑动条交互界面与直方图可视化分析&#xff0c;方便调试和理解效果。 亮度调整 图…

WAF(web应用防火墙)的简单了解

WAF称之为Web应用防火墙&#xff0c;是一种专门设计用于保护web应用程序免受恶意攻击的安全设备&#xff0c;能实时监控过滤和拦截可能对网站造成危害的网络流量&#xff0c;从而避免网络服务器被恶意入侵导致性能异常、数据泄露、服务中断这些问题 (WAF是通过执行一系列针对HT…

跟着AI学习C# Day28

&#x1f4c5; Day 28&#xff1a;C# 源生成器&#xff08;Source Generators&#xff09;与编译时元编程 ✅ 学习目标&#xff1a; 理解什么是 源生成器&#xff08;Source Generator&#xff09;&#xff1b;掌握如何在 编译阶段生成 C# 代码&#xff0c;而不是运行时动态处…

设计模式精讲 Day 4:建造者模式(Builder Pattern)

【设计模式精讲 Day 4】建造者模式&#xff08;Builder Pattern&#xff09; 文章简述&#xff1a; 在软件开发中&#xff0c;对象的构造过程往往复杂且容易出错&#xff0c;尤其是在对象包含多个可选参数或构建步骤时。建造者模式&#xff08;Builder Pattern&#xff09;正是…

如何轻松地将联系人从 iPhone 转移到 iPhone?

也许您升级到最新的 iPhone 型号&#xff0c;或者需要切换到另一部 iPhone 来工作。无论如何&#xff0c;您不能错过您的联系人&#xff0c;这对每个人来说都是最重要的数据。因此&#xff0c;今天我们将分享 5 种如何将联系人从 iPhone 转移到 iPhone 的方法&#xff0c;帮助您…

【51单片机简单的流水灯程序问题】2022-5-24

1.利用单片机的P2口接8个发光二极管。简单的流水灯程序问题-编程语言-CSDN问答 2&#xff0e;发光二极管自由闪烁&#xff08;自己设计两种模式&#xff09;。 3&#xff0e;可通过按键实现暂停、启动以及不用模式的切换。 4. 利用Proteus绘制电路原理图 5. 元件选型&#xff1…

第七节:Vben Admin 最新 v5.0 (vben5) 快速入门 - 用户管理(上)

Vben5 系列文章目录 💻 基础篇 ✅ 第一节:Vben Admin 最新 v5.0 (vben5) 快速入门 ✅ 第二节:Vben Admin 最新 v5.0 (vben5) 快速入门 - Python Flask 后端开发详解(附源码) ✅ 第三节:Vben Admin 最新 v5.0 (vben5) 快速入门 - 对接后端登录接口(上) ✅ 第四节:Vben Ad…

1572. 矩阵对角线元素的和

给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1&#xff1a; 输入&#xff1a;mat [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;25 解释&#xff1a;对角线的和为&#xf…

供应链场景使用ClickHouse最佳实践

一、概述 ClickHouse是一款由俄罗斯公司Yandex开发的开源列式数据库管理系统&#xff0c;以其高性能的分析查询能力和高压缩比著称。供应链场景中&#xff0c;数据量大且数据类型复杂&#xff0c;需要高效的数据存储和快速的查询性能&#xff0c;ClickHouse在这些方面具有显著…

RA4M2开发IOT(0)----安装e² studio

RA4M2开发IOT.0--安装e studio 概述视频教学样品申请安装 概述 瑞萨电子灵活配置软件包 (FSP) 是用于嵌入式系统设计的高质量增强型软件包&#xff0c;支持瑞萨电子 RA 产品家族 Arm 微控制器&#xff0c;提供用户友好的界面且可灵活扩展&#xff0c;确保从入门级到高性能的整…

【Ambari3.0.0 部署】Step2—免密登陆认证-适用于el8

如果有其他系统部署需求可以参考原文 戳我->所有组件编译教程 戳我->获取部署源代码 一、免密登录认证 &#x1f510; 在多台服务器协同工作的环境中&#xff0c;免密登录&#xff08;SSH 免密认证&#xff09;是一种常见的优化手段&#xff0c;能够极大地提升运维效率&…

网站自助广告投放系统源码 附安装教程(源码下载)

网站自助广告投放系统源码 全自动无人化出售网站广告位 站长必备 源码测试可用&#xff0c;部分加密。感兴趣自行下载 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/91093092 更多资源下载&#xff1a;关注我 图片&#xff1a;

日常运维问题汇总-15

42.SD开票计划产生的预收款在正式开票时未自动清账 统驭科目&#xff08;应收、预收&#xff09;对应的字段状态组中附加科目设置销售订单字段设置为了隐藏导致&#xff0c;更改为“可选输入项” 43.MIGO取消凭证时&#xff0c;用户反馈发现除一行外&#xff0c;其它都不能取消…

【设计模式】6.原型模式

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 原型模式 1. 基础 import copyclass Resume:def __init__(self, name):self.name nameself.sex Noneself.age Noneself.time_area Noneself.compan…

【算法 day08】LeetCode 151.翻转字符串里的单词 |卡码网:55.右旋转字符串

151.翻转字符串里的单词 题目链接 | 文档讲解 |视频讲解 : 链接 1.思路&#xff1a; 1.去除字符串头尾的空格 &#xff0c;使用库函数 trim&#xff08;&#xff09; 2.对字符串进行分割&#xff0c;使用库函数split&#xff08;&#xff09; 3.创建StringBuilder sb&#x…

【WordPress优化插件】WPOPT v2.4.7

WPOPT插件,是由本站开发的一款WordPress优化插件,能对WordPress底层功能进行优化,支持功能开关,系统加速等功能。 2.0版本全新发布,采用vite打包,界面采用Vue3+element-plus制作。无论是外观,还是框架功能,都是空前的强大。 功能更多,更强,是所有WordPress网站都值得…

如何使用 mkimage 工具生成 uImage 文件(RISC-V 环境)

一、mkimage 命令参数详解 在 RISC-V Linux 环境下&#xff0c;使用 U-Boot 的 mkimage 工具生成 uImage 的基本命令格式如下&#xff1a; mkimage -A riscv -O linux -T kernel -C compression -a load_addr -e entry_addr -n "描述信息" -d Image uImage核心参数…

React Native 搭建iOS与Android开发环境

目录 第一步 第二步 一、必须安装的工具 二、具体安装步骤 1. 安装 Homebrew 切换国内源和其他配置&#xff1a; 2. 安装 node 3.下载watchman 4. Ruby 5.CocoaPods 配置环境 6. jdk 7. 配置git 开发环境 第三步——启动项目&#xff08;可以忽略&#xff09; 1…

Vue 简写形式全解析:清晰记忆指南

Vue 简写形式全解析:清晰记忆指南 Vue 中的各种简写形式确实容易混淆,我将它们系统化整理,并提供了多种记忆方法,帮助你轻松掌握! 一、核心简写形式汇总表 完整形式简写形式适用场景记忆技巧v-bind:attribute:attribute动态绑定属性: 像链条,表示"绑定"v-on:…

车载电子电器架构 --- 电子电气架构设计方案

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…