ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【Django开发】前后端分离美多商城项目第2篇:项目准备【附代码文档】 [打印本页]

作者: 魏晓东    时间: 2024-5-14 06:48
标题: 【Django开发】前后端分离美多商城项目第2篇:项目准备【附代码文档】

美多商城项目4.0文档完整教程(附代码资料)主要内容报告:美多商城,项目准备,商业模式先容,开发流程,需求分析,项目架构,创建工程,1. 在git平台创建工程1.B2B--企业对企业,2.C2C--个人对个人,3.B2C--企业对个人,4.C2B--个人对企业,5.O2O--线上到线下,6.F2C--工厂到个人,7.B2B2C--企业--企业--个人,1. 用户部分,2. 商品部分,3. 购物车部分,4. 订单部分,5. 支付部分,2. 添加前端文件,3. 创建Django REST framework工程,4. 修改manage.py,5. 创建数据库。项目准备,配置,用户部分,用户模子类,注册1. 修改settings/dev.py 文件中的路径信息,2. INSTALLED_APPS,3. 数据库,4. Redis,5. 当地化语言与时区,6. 日志,7. 非常处理,设计接口的思路。用户部分,图片验证码,短信验证码,跨域CORS。用户部分,使用Celery完成发送短信,判定帐号是否存在,注册1. 判定用户名是否存在,2. 判定手机号是否存在:。用户部分,JWT,什么是JWT,Django REST framework JWT劈头,基于token的鉴权机制,JWT长什么样?,JWT的构成,总结,安装配置,使用。用户部分,登录,登录,返回登录网址的视图创建模子类,urllib使用阐明。登录,登录回调处理创建模子类,urllib使用阐明。登录,绑定用户身份接口,用户中心个人信息,邮件与验证,使用Django发送邮件创建模子类,urllib使用阐明。邮件与验证,生存邮箱并发送验证邮件,验证邮箱链接,收货地址。收货地址,省市区地址查询。收货地址,使用缓存,用户地址管理,用户地址管理代码,商品部分。商品部分,数据库表设计,FastDFS分布式文件体系,Docker使用表布局,数据库模子类,1. 什么是FastDFS,2. 文件上传流程,3. 浅易FastDFS构建。Docker使用,Docker简介1. 虚拟化,2. 什么是Docer,3. Docker组件,4 使用Docker做什么。Docker使用,安装与操作,使用Docker安装FastDFS1. 在Ubuntu中安装Docker,2. 启动与停止,3. Docker镜像操作,4. Docker 容器操作,5. 将容器生存为镜像,6. 镜像备份与迁徙,1. 获取镜像,2. 运行tracker,3. 运行storage。商品部分,FastDFS客户端与自定义文件存储体系,CKEditor富文本编辑器,添加测试数据1. FastDFS的Python客户端,2. 自定义Django文件存储体系,3. 在Django配置中设置自定义文件存储类,4. 添加image域名。商品部分,页面静态化,定时任务,静态化首页的手动脚本。商品部分,商品详情页。商品部分,用户欣赏汗青记录1. 生存,2. 查看。商品部分,商品列表页获取商品列表数据。商品部分,商品搜索。购物车部分,购物车数据存储设计,添加到购物车1. Redis生存已登任命户,2. Cookie生存未登任命户。购物车部分,查询购物车数据,修改购物车数据,删除购物车数据,购物车全选。购物车部分,登录归并购物车,订单部分,订单数据库设计,订单结算。订单部分,生存订单,下单成功页面。支付,接入,发起支付,生存支付结果。Xadmin,用户权限控制,数据库读写分离1. 安装,2. 使用。数据库读写分离,MySQL主从同步,配置Django实现数据库读写分离,部署1. 主从同步的定义,2. 主从同步的机制,3. 配置主从同步的基本步调,4. 具体配置主从同步的方法。。meiduo_mallBuild Setup。

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

感爱好的小伙伴可以自取哦,欢迎各人点赞转发~



项目准备

配置

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

我们将Django的应用放到了 工程目录/meiduo_mall/apps目录下,如果创建一个应用,比如users,那么在配置文件的INSTALLED_APPS中注册应用应该如下:
  1. INSTALLED_APPS = [
  2.     ...
  3.     'meiduo_mall.apps.users.apps.UsersConfig',
  4. ]
复制代码
为了还能像如下方式简便的注册引用,我们需要向Python解释器的导包路径中添加apps应用目录的路径。
  1. INSTALLED_APPS = [
  2.     ...
  3.     'users.apps.UsersConfig',
  4. ]
复制代码
我们将配置文件改为放在settings子目录下,所以 配置文件中的BASE_DIR指向的变为了meiduo/meiduo_mall/meiduo_mall。
使用sys.path添加/apps目录,即可添加apps应用的导包路径。
  1.   
  2.   
  3. # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
  4.   
  5.   
  6. BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  7.   
  8.   
  9. # 添加导包路径
  10.   
  11.   
  12. import sys
  13. sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
复制代码
2. INSTALLED_APPS

在INSTALLED_APPS中添加rest_framework
  1. INSTALLED_APPS = [
  2.     ...
  3.     'rest_framework',
  4. ]
复制代码
3. 数据库
  1. DATABASES = {
  2.     'default': {
  3.         'ENGINE': 'django.db.backends.mysql',
  4.         'HOST': '127.0.0.1',  # 数据库主机
  5.         'PORT': 3306,  # 数据库端口
  6.         'USER': 'meiduo',  # 数据库用户名
  7.         'PASSWORD': 'meiduo',  # 数据库用户密码
  8.         'NAME': 'meiduo_mall'  # 数据库名字
  9.     }
  10. }
复制代码
留意:
记得在meiduo/meiduo_mall/__init__.py文件中添加
  1. import pymysql
  2. pymysql.install_as_MySQLdb()
复制代码
4. Redis

安装django-redis,并配置
  1. CACHES = {
  2.     "default": {
  3.         "BACKEND": "django_redis.cache.RedisCache",
  4.         "LOCATION": "redis://10.211.55.5:6379/0",
  5.         "OPTIONS": {
  6.             "CLIENT_CLASS": "django_redis.client.DefaultClient",
  7.         }
  8.     },
  9.     "session": {
  10.         "BACKEND": "django_redis.cache.RedisCache",
  11.         "LOCATION": "redis://10.211.55.5:6379/1",
  12.         "OPTIONS": {
  13.             "CLIENT_CLASS": "django_redis.client.DefaultClient",
  14.         }
  15.     }
  16. }
  17. SESSION_ENGINE = "django.contrib.sessions.backends.cache"
  18. SESSION_CACHE_ALIAS = "session"
复制代码
除了名为default的redis配置外,还增补了名为session的redis配置,分别使用两个不同的redis库。
同时修改了Django的Session机制使用redis生存,且使用名为'session'的redis配置。
此处修改Django的Session机制存储主要是为了给Admin站点使用。
**关于django-redis 的使用,阐明文档可见[
5. 当地化语言与时区
  1. LANGUAGE_CODE = 'zh-hans'
  2. TIME_ZONE = 'Asia/Shanghai'
复制代码
6. 日志
  1. LOGGING = {
  2.     'version': 1,
  3.     'disable_existing_loggers': False,  # 是否禁用已经存在的日志器
  4.     'formatters': {  # 日志信息显示的格式
  5.         'verbose': {
  6.             'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'
  7.         },
  8.         'simple': {
  9.             'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
  10.         },
  11.     },
  12.     'filters': {  # 对日志进行过滤
  13.         'require_debug_true': {  # django在debug模式下才输出日志
  14.             '()': 'django.utils.log.RequireDebugTrue',
  15.         },
  16.     },
  17.     'handlers': {  # 日志处理方法
  18.         'console': {  # 向终端中输出日志
  19.             'level': 'DEBUG',
  20.             'filters': ['require_debug_true'],
  21.             'class': 'logging.StreamHandler',
  22.             'formatter': 'simple'
  23.         },
  24.         'file': {  # 向文件中输出日志
  25.             'level': 'INFO',
  26.             'class': 'logging.handlers.RotatingFileHandler',
  27.             'filename': os.path.join(os.path.dirname(BASE_DIR), "logs/meiduo.log"),  # 日志文件的位置
  28.             'maxBytes': 300 * 1024 * 1024,
  29.             'backupCount': 10,
  30.             'formatter': 'verbose'
  31.         },
  32.     },
  33.     'loggers': {  # 日志器
  34.         'django': {  # 定义了一个名为django的日志器
  35.             'handlers': ['console', 'file'],  # 可以同时向终端与文件中输出日志
  36.             'propagate': True,  # 是否继续传递日志信息
  37.             'level': 'DEBUG',  # 日志器接收的最低日志级别
  38.         },
  39.     }
  40. }
复制代码
7. 非常处理

修改Django REST framework的默认非常处理方法,增补处理数据库非常和Redis非常。
新建utils/exceptions.py
  1. from rest_framework.views import exception_handler as drf_exception_handler
  2. import logging
  3. from django.db import DatabaseError
  4. from redis.exceptions import RedisError
  5. from rest_framework.response import Response
  6. from rest_framework import status
  7.   
  8.   
  9. # 获取在配置文件中定义的logger,用来记录日志
  10.   
  11.   
  12. logger = logging.getLogger('django')
  13. def exception_handler(exc, context):
  14.     """
  15.     自定义异常处理
  16.     :param exc: 异常
  17.     :param context: 抛出异常的上下文
  18.     :return: Response响应对象
  19.     """
  20.     # 调用drf框架原生的异常处理方法
  21.     response = drf_exception_handler(exc, context)
  22.     if response is None:
  23.         view = context['view']
  24.         if isinstance(exc, DatabaseError) or isinstance(exc, RedisError):
  25.             # 数据库异常
  26.             logger.error('[%s] %s' % (view, exc))
  27.             response = Response({'message': '服务器内部错误'}, status=status.HTTP_507_INSUFFICIENT_STORAGE)
  28.     return response
复制代码
配置文件中添加
  1. REST_FRAMEWORK = {
  2.     # 异常处理
  3.     'EXCEPTION_HANDLER': 'meiduo_mall.utils.exceptions.exception_handler',
  4. }
复制代码
用户部分

用户模子类

Django提供了认证体系,文档资料可参考此链接[
Django认证体系同时处理认证和授权。简单地讲,认证验证一个用户是否它们声称的谁人人,授权决定一个通过了认证的用户被允许做什么。 这里的词语“认证”同时指代这两项任务,即Django的认证体系同时提供了认证机制和权限机制。
Django的认证体系包罗:
Django默认提供的认证体系中,用户的认证机制依赖Session机制,我们在本项目中将引入JWT认证机制,将用户的身份根据存放在Token中,然后对接Django的认证体系,帮助我们来实现:
Django用户模子类

Django认证体系中提供了用户模子类User生存用户的数据,默认的User包罗以下常见的基本字段:
必选。 150个字符以内。 用户名可能包罗字母数字,_,@,+ . 和-个字符。在Django更改1.10:max_length从30个字符增长到150个字符。
可选(blank=True)。 少于等于30个字符。
可选(blank=True)。 少于等于30个字符。
可选(blank=True)。 邮箱地址。
必选。 暗码的哈希及元数据。 (Django 不生存原始暗码)。 原始暗码可以无限长而且可以包罗任意字符。
与Group 之间的多对多关系。
与Permission 之间的多对多关系。
布尔值。 指示用户是否可以访问Admin 站点。
布尔值。 指示用户的账号是否激活。 我们建议您将此标记设置为False而不是删除帐户;如许,如果您的应用程序对用户有任何外键,则外键不会中断。它不是用来控制用户是否能够登录。 在Django更改1.10:在旧版本中,默认is_active为False不能进行登录。
布尔值。 指定这个用户拥有所有的权限而不需要给他们分配明确的权限。
用户末了一次登录的时间。
账户创建的时间。 当账号创建时,默认设置为当前的date/time。
常用方法:

设置用户的暗码为给定的原始字符串,并负责暗码的。 不会生存User 对象。当None 为raw_password 时,暗码将设置为一个不可用的暗码。
如果给定的raw_password是用户的真实暗码,则返回True,可以在校验用户暗码时使用。
管理器方法:

管理器方法即可以通过User.objects. 进行调用的方法。
创建、生存并返回一个User对象。
与create_user() 相同,但是设置is_staff 和is_superuser 为True。
创建自定义的用户模子类

Django认证体系中提供的用户模子类及方法很方便,我们可以使用这个模子类,但是字段有些无法满足项目需求,如本项目中需要生存用户的手机号,需要给模子类添加额外的字段。
Django提供了django.contrib.auth.models.AbstractUser用户抽象模子类允许我们继承,扩展字段来使用Django认证体系的用户模子类。
我们如今在meiduo/meiduo_mall/apps中创建Django应用users,并在配置文件中注册users应用。
在创建好的应用models.py中定义用户的用户模子类。
  1. class User(AbstractUser):
  2.     """用户模型类"""
  3.     mobile = models.CharField(max_length=11, unique=True, verbose_name='手机号')
  4.     class Meta:
  5.         db_table = 'tb_users'
  6.         verbose_name = '用户'
  7.         verbose_name_plural = verbose_name
复制代码
我们自定义的用户模子类还不能直接被Django的认证体系所识别,需要在配置文件中告知Django认证体系使用我们自定义的模子类。
在配置文件中进行设置
  1. AUTH_USER_MODEL = 'users.User'
复制代码
AUTH_USER_MODEL 参数的设置以点.来分隔,表现应用名.模子类名。
留意:Django建议我们对于AUTH_USER_MODEL参数的设置一定要在第一次数据库迁徙之前就设置好,否则后续使用可能出现未知错误。
执行数据库迁徙
  1. python manage.py makemigrations
  2. python manage.py migrate
复制代码
注册

创建好用户模子类后,我们开始来实现第一个业务逻辑——用户注册。
设计接口的思路

在前后端分离的应用模式中,我们作为后端开发职员设计后端接口时,可以不用考虑返回给前端数据后,前端如那里理,这是前端开发职员的工作,我们只需明确我们要生存的或者要返回的是什么数据即可。
明确上述每一点后,即可开始编写接口。
注册业务接口分析

在用户注册中,需要实现以下接口:
图片验证码、短信验证码考虑到后续可能会在其他业务中也用到,因此我们将图片验证码独立,创建一个新应用verifications,在此应用中实现图片验证码、短信验证码
未完待续, 同学们请等候下一期

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

感爱好的小伙伴可以自取哦,欢迎各人点赞转发~


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4