教程总体简介:美多商城 商业模式介绍 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发送邮件 保存邮箱并发送验证邮件 验证邮箱链接
完整笔记资料代码:gitee.com/yinuo112/Ba…
感兴趣的小伙伴可以自取哦~
全套教程部分目录:
部分文件图片:
项目准备
配置
1. 修改settings/dev.py 文件中的路径信息
我们将Django的应用放到了 工程目录/meiduo_mall/apps目录下,如果创建一个应用,比如users,那么在配置文件的INSTALLED_APPS中注册应用应该如下:
INSTALLED_APPS = [
...
'meiduo_mall.apps.users.apps.UsersConfig',
]
为了还能像如下方式简便的注册引用,我们需要向Python解释器的导包路径中添加apps应用目录的路径。
INSTALLED_APPS = [
...
'users.apps.UsersConfig',
]
我们将配置文件改为放在settings子目录下,所以 配置文件中的BASE_DIR指向的变为了meiduo/meiduo_mall/meiduo_mall。
使用sys.path添加<BASE_DIR>/apps目录,即可添加apps应用的导包路径。
# 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
INSTALLED_APPS = [
...
'rest_framework',
]
3. 数据库
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文件中添加
import pymysql
pymysql.install_as_MySQLdb()
4. Redis
安装django-redis,并配置
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. 本地化语言与时区
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
6. 日志
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
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
配置文件中添加
REST_FRAMEWORK = {
# 异常处理
'EXCEPTION_HANDL