项目流程

web应用模式

  • 前后端不分离

  • ![enter descriptio在这里插入图片描述

  • 前后端分离

  • ![enter description here][2] 在这里插入图片描述

  • 在前后端分离的应用模式中,我们通常将后端开发的每个视图都称为一个接口,或者API,前端通过访问接口来对数据进行增删改查。

RESTful

  • 即Representational State Transfer的缩写,国内大部分人理解为“表现层状态转化”
  • RESTful是一种开发理念, REST是设计风格而不是标准, 描述的是在网络中client和server的一种交互形式;REST本身不实用,实用的是如何设计 RESTful API(REST风格的网络接口)

RESTful架构总结:

  • 每一个URL代表一种资源
  • 客户端和服务器之间,传递这种资源的某种变现层
  • 客户端通过四个HTTP动词,对服务器端资源进行操作,实现‘变现层状态转化’

RESTful设计方法

使用Django开发REST接口

REST接口开发的核心任务

- 将请求的数据(如json格式)转换为模型类对象
- 操作数据库
- 将模型类对象转换为响应的数据(如json)

序列化Serializer

  • 将程序中的一个数据结构类型转换为其他格式(字典、JSON、XML等),例如将Django中的模型类对象装换为JSON字符串,这个转换过程我们称为序列化。

Django REST framework

  • 是一个用于构建Web API 的强大而又灵活的工具, 简称:DRF

DRF特点

提供了定义序列化器Serializer的方法,可以快速根据 Django ORM 或者其它库自动序列化/反序列化;
提供了丰富的类视图、Mixin扩展类,简化视图的编写;
丰富的定制层级:函数视图、类视图、视图集合到自动生成 API,满足各种需要;
多种身份认证和权限认证方式的支持;
内置了限流系统;
直观的 API web 界面;
可扩展性,插件丰富

DRF工程搭建

环境安装与配置

  • DRF是以Django扩展应用的方式提供的,所以我们可以直接利用已有的Django环境而无需从新创建。(若没有Django环境,需要先创建环境安装Django)
  • 安装DRF:pip install djangorestframework
  • 添加rest_framework应用:在setting.py中的INSTALLED_APPS添加‘rest_framework’

DRF

  • 1、创建序列化器
    – model:指明该序列化器处理的数据字段从模型类BookInfo参考生成
    – fields 指明该序列化器包含模型类中的哪些字段,'all’指明包含所有字段
  • 2、编写视图
    • queryset 指明该视图集在查询数据时使用的查询集
    • serializer_class 指明该视图在进行序列化或反序列化时使用的序列化器
  • 定义路由
  • 运行测试

serializer 序列化器

定义serializer

  • 定义方法:使用类来定义,须继承自rest_framework.serializers.Serializer。
    注意:serializer不是只能为数据库模型类定义,也可以为非数据库模型类的数据定义。
  • 创建serializer对象: Serializer(instance=None, data=empty, * * kwargs)
    • 用于序列化时,将模型类对象传入instance参数
    • 用于反序列化时,将要被反序列化的数据传入data参数
    • 除了instance和data参数外,在构造Serializer对象时,还可通过context参数额外添加数据,

序列化使用

  • 首先查询出一个对象
  • 构造序列化器对象
  • 获取序列化器数据
  • 如果要被序列化的是包含多条数据的查询集QuerySet,可以通过添加many=True参数补充说明

反序列化使用

验证

  • 在获取反序列化的数据前,必须调用is_valid()方法进行验证,验证成功返回True,否则返回False。

三种方法补充定义验证行为

  • validate 对<field_name>字段进行验证
  • 在序列化器中需要同时对多个字段进行比较验证时,可以定义validate方法来验证
  • 在字段中添加validators选项参数,也可以补充验证行

保存

如果在验证成功后,想要基于validated_data完成数据对象的创建,可以通过实现create()和update()两个方法来实现。

模型类序列化器ModelSerializer

如果我们想要使用序列化器对应的是Django的模型类,DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一个Serializer类

  • 基于模型类自动生成一系列字段
  • 基于模型类自动为Serializer生成validators
  • 包含默认的create()和update()的实现

model 指明参照哪个模型类

fields 指明为模型类的哪些字段生成

美多商城

项目准备

  • 在git平台创建工程
  • 添加前端文件
  • 创建DRF工程
  • 创建数据库

配置

  • 修改settings/dev.py 文件中的路径信息
  • 在INSTALLED_APPS中添加rest_framework
  • 设置数据库,并在meiduo_mall的__init__文件中添加:pymysql.install_as_MySQLdb()、
  • 安装django-redis,并在settings中配置
  • 设置本地化语言与时区
  • 设置log日志
  • 新建utils/exceptions.py,定义异常处理的函数,并在配置文件中添加异常处理的配置

用户部分

用户模型类

  • 在apps中创建Django应用users,并在配置文件中注册users应用
  • 创建完应用后执行数据库的迁移
  • 注意:Django建议我们对于AUTH_USER_MODEL参数的设置一定要在第一次数据库迁移之前就设置好,否则后续使用可能出现未知错误。

注册

接口分析

  • 图片验证码
  • 短信验证码
  • 用户名判断是否存在
  • 手机号判断是否存在
  • 注册保存用户数据
    图片验证码、短信验证码考虑到后续可能会在其他业务中也用到,因此我们将图片验证码独立,创建一个新应用verifications,在此应用中实现图片验证码、短信验证码。
    图片验证码后端接口设计:
    访问方式:GET/image——codes/(?p<image_code_id>[\w-]+)/
    请求参数:路径参数
    image_code_id, 类型:uuuid字符串,(图片验证码编号)
    返回数据:验证码图片

短信验证码

业务处理流程

  • 检查图片验证码
  • 检查是否在60s内有发送记录
  • 生成短信验证码
  • 保存短信验证码与发送记录
  • 发送短信

后端接口设计

  • 访问方式:GET /sms_codes/(?P1[3-9]\d{9})/?image_code_id=xxx&text=xxx
  • 请求参数:路径参数与查询字符串参数
  • mobile, image_code_id, text.
  • 返回数据:json;返回值:message;
  • 在vertifications定义序列化器:ImageCodeCheckSerializer用以校验;因要校验验证码编号以及客户端输入的text所以要定义validate方法用以校验

跨域CORS

  • 因为前后端分别设置了不同的域名,此处使用CORS来解决后端对跨域访问的支持;使用django-cors-headers扩展
  • 在setting中添加应用以及中间层设置;添加白名单
  • CORS_ALLOW_CREDENTIALS = True # 允许携带cookie;指明在跨域访问中,后端是否支持对cookie的操作

使用celery发送短信

  • 在meiduo_mall下创建celery_tasks用以保存celery异步任务;
  • 在celery_tasks文件夹下创建config文件,保存celery的配置信息
  • 再创建main.py文件用作celery的启动文件
  • 创建sms目录,并在sms文件夹下创建tasks文件,用以保存发送短信的异步任务
  • 在验证码应用中的views文件中改写SMSCodeView视图,使用celery异步任务发送短信

判断账号是否存在

判断用户名是否存在:

  • 请求方式:GET usernames/(?P\w{5,20})/count/
  • 请求参数:路径参数;username
  • 返回数据:json;返回值:username,count

判断手机号是否存在

  • 方式和判断用户名一样

注册

接口设计:

  • 请求方式:POST/users/
  • 请求参数JOSN或表单
  • 参数:username;password; password2; sms_code;mobile, allow(是否同意用户协议)
  • 返回数据:JSON; id, username, mobile

JWT(Json web token)

在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证。我们不再使用Session认证机制,而使用Json Web Token认证机制。

  • session认证所显露的问题,
    • session是保存在内存中的,随着用户的增多,服务端的开销会明显增大
    • 扩展性:用户认证之后,服务端做认证记录,如果认证的记录被保存在内存中的话,这意味着用户下次请求还必须要请求在这台服务器上,这样才能拿到授权的资源,这样在分布式的应用上,相应的限制了负载均衡器的能力。这也意味着限制了应用的扩展能力。
    • 因为是基于cookie来进行用户识别的, cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击。

基于token的鉴权机制

token必须要在每次请求时传递给服务端,它应该保存在请求头里

  • JWT是由三段信息构成的,将这三段信息文本用.链接一起就构成了Jwt字符串
  • 第一部分头部:header,第二部分荷载:payload,第三部分:签证(signature)
    总结:
  • 优点:因为json的通用性,所以JWT是可以进行跨语言支持的,像JAVA,JavaScript,NodeJS,PHP等很多语言都可以使用。
    因为有了payload部分,所以JWT可以在自身存储一些其他业务逻辑所必要的非敏感信息。
    便于传输,jwt的构成非常简单,字节占用很小,所以它是非常便于传输的。
    它不需要在服务端保存会话信息, 所以它易于应用的扩展
  • 安全相关:不应该在jwt的payload部分存放敏感信息,因为该部分是客户端可解密的部分。
    保护好secret私钥,该私钥非常重要。
    如果可以,请使用https协议

Django REST framework JWT

关于签发和核验JWT,我们可以使用Django REST framework JWT扩展来完成

  • 安装djangorestframework-jwt,并在配置文件中配置,
  • JWT_AUTH = {
    ‘JWT_EXPIRATION_DELTA’: datetime.timedelta(days=1),
    },JWT_EXPIRATION_DELTA 指明token的有效期

登录

业务说明: 验证用户名和密码,验证成功后,为用户签发JWT,前端将签发的JWT保存下来。
后端接口设计:

  • 请求方式:POST/authorizations/
  • 请求参数:json或表单;参数:username,password
  • 返回数据:JSON,username, user_id, token

Django REST framework JWT提供了登录签发JWT的视图,可以直接使用

但是默认的返回值仅有token,我们还需在返回值中增加username和user_id。
from rest_framework_jwt.views import obtain_jwt_token

urlpatterns = [
url(r’^authorizations/$’, obtain_jwt_token),
]
通过修改该视图的返回值可以完成我们的需求。

QQ登录

![enter description here][3]在这里插入图片描述

创建模型类

创建新应用:oauth,总路由前缀:oauth/

  • 在meiduo_mall/utils/models.py文件中创建模型类基类,用以增加数据新建时间和更新时间;
  • 在oauth/models.py中定义QQ身份(openid)与用户模型类User的关联关系
    openid = models.CharField(max_length=64, verbose_name=‘openid’, db_index=True)
  • 进行数据库的迁移

返回qq登录网址的视图

qq登录回调处理

绑定用户身份接口

业务逻辑:
用户需要填写手机号、密码、图片验证码、短信验证码
如果用户未在美多商城注册过,则会将手机号作为用户名为用户创建一个美多账户,并绑定用户
如果用户已在美多商城注册过,则检验密码后直接绑定用户
处理流程:
![enter description here][4]在这里插入图片描述

用户个人信息中心

邮件与验证

使用django发送邮件

django中内置了邮件的发送功能, 被定义在django.core.mail模块中; 发送邮件需要使用SMTP服务器

  • 使用django发送邮件:
    django.core.mail模块提供了send_mail来发送邮件
    send_mail(subject, message, from_email, recipient_list,html_message=None)
  • subject 邮件标题
    message 普通邮件正文, 普通字符串
    from_email 发件人
    recipient_list 收件人列表
    html_message 多媒体邮件正文,

保存邮件并发送验证邮件

  • 在保存邮箱的时候,需要向用户发送验证邮件,我们将发送邮件的工作放到celery中异步执行。
  • 在celerytasks目录中新建email目录和email/_init.py文件和email/tasks.py文件

收货地址

业务逻辑

省市区地址的数据库建立与查询
用户地址的增删改查处理
设置默认地址
设置地址标题

省市区联动:

在用户录入地址时,需要进行省市区的选择。在页面加载时,向后端请求省份数据,当用户选择确定省份后,向后端请求该省份的城市数据;在用户选择确定城市数据后,向后端请求该城市的区县信息。我们把这个过程称为省市区三级联动。
- 新建一个应用areas来实现省市区三级联动。
- 在area/models中以子关联的方式创建数据库表,子关联字段的外键指向自身,所以Foreignkey(‘self"’)
- 迁移到数据库中后,将area.sql中数据导入到数据库中
- 此时可以创建一个脚本,在script中创建import_areas_data_to_db.sh文件,将迁移命令写入脚本中,再为文件添加可执行权限,执行脚本文件即可
- 创建完模型类,并进行数据库迁移后,在areas/serializers.py文件中新建序列化器
- 在views.py文件中新建视图
- 定义路由
- 在前端文件中修改user_center_site.py文件,增加vue变量,并新建user_center_site.js文件

使用缓存

因为省市区的数据是经常被用户查询使用的,而且数据基本不变,所以可以将此数据进行缓存处理,减少数据库的查询次数
  • djangoREST framework中使用缓存,可以通过drf-extention扩展来实现
  • 首先进行安装:pip install drf-extention
  • 使用rest_frame_work_extention.cache.decorators中的cache_response装饰器来装饰返回数据的类视图的对象方
    ···python
    class CityView(views.APIView):
    @cache_response()
    def get(self, request, *args, **kwargs):

    cache_response可以接受两个参数

用户地址管理

为了保存y用户的地址信息,在models中定义模型类

  • 在views中添加视图
  • 在serializers中创建序列化器
  • 在users/urls.py中添加路由
  • 在前端修改user_center_site.js文件

商品部分

数据表的设计

SPU和SKU

  • SPU是商品信息聚合的最小单位,是一组可服用、易检索的标准化信息的集合,该集合描述了一个产品的特性。通俗的讲,属性值、特性相同的商品就可以称为一个SPU。
  • SKU即库存进出计量的单位,可以是以件、盒、托盘等为单位,是物理上不可分割的最小存货单元。在使用时要根据不同业态,不同管理模式来处理。在服装、鞋类商品中使用最多最普遍。
  • 常见新的应用goods,并在models文件中创建新的商品数据模型类
  • 创建新的广告内容应用contents, 以及创建广告数据模型类

FastDFS分布式文件系统

FastDFS 是用 c 语言编写的一款开源的分布式文件系统。FastDFS 为互联网量身定制, 充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用 FastDFS 很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

  • 包含Tracker server 和Storage server,客户端请求Tracker Server进行文件 上传和下载,通过Tracker Server进行调度最终由Storage server完成文件的上传和下载

使用Docker进行安装

  • 镜像:镜像是构建 Docker 的基石。用户基于镜像来运行自己的容器。镜像也是 Docker 生命周 期中的“构建”部分。镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构 建出来
  • Docker容器:一个镜像格式; 一些列标准操作; 一个执行环境。

使用Docker安装FastDFS

  • 1、获取镜像
  • 2、运行Tracker:执行命令开启
  • 3、运行Storage:执行命令开启
  • 注意:如果无法重新运行,可以删除/var/fdfs/storage/data目录下的fdfs_storaged.pid 文件,然后重新运行storage

使用FastDFS客户端,需要有配置文件。在meiduo_mall/utils目录下新建fastdfs目录,client.conf配置文件放到这个目录中。

  • 上传文件需要先创建fdfs_client.client.Fdfs_client的对象,并指明配置文件
  • 通过创建的客户端对象执行上传文件的方法

自定义文件存储器

  • 需要继承自django.core.files.storage.Storage
  • 支持Django不带任何参数来实例化存储类,也就是说任何设置都应该从django.conf.settings中获取
  • 存储类中必须实现_open()和_save()方法,以及任何后续使用中可能用到的其他方法。
  • 需要为存储类添加django.utils.deconstruct.deconstructible装饰器
  • 在meiduo_mall/utils/fastdfs目录中创建fdfs_storage.py文件,实现可以使用FastDFS存储文件的存储类
  • 在Django配置中设置自定义文件存储类,在settings/dev.py文件中添加设置
  • 在/etc/hosts中添加访问FastDFS storage服务器的域名

CKEditor富文本编辑器

富文本即具备丰富样式格式的文本。

  • 安装
  • 在配置文件中添加应用
  • 添加CKEditor设置
  • 在总路由中添加ckeditor路由
  • 为模型类添加字段

页面静态化

页面静态化即将动态渲染生成的页面结果保存成html文件,放到静态文件服务器中。用户访问的时候访问的直接是处理好之后的html静态文件。

  • 在广告内容应用contents中,新建crons.py文件
  • 在配置文件中添加保存静态文件的目录
  • 在meiduo_mall 中新建templates模板目录,配置模板目录, 并在模板目录中新建index.html模板文件
  • 在前端js目录中新建index.js文件

定时任务

通过django-crontab扩展来实现定时任务

  • 安装
  • 添加应用
  • 在配置文件中设置定时执行的时间

静态化首页的手动脚本

在scripts中新建静态化首页的脚本regenerate_index_html.py,并为文件增加可执行权限

商品详情页

品详情页的静态化由运营人员在编辑商品信息时触发生成静态化页面,
先来实现静态化异步任务,在celery_tasks中新建html/tasks.py任务
生成静态商品详情页面

  • 商品分类菜单
  • 获取当前sku的信息
  • 面包屑导航信息中的频道
  • 构建当前商品的规格键
  • 获取 当前商品的所有sku
  • 构建不同规格参数(规格)的sku字典
  • 获取当前商品的规格信息
  • 若当前sku的规格信息不完整, 则不再继续
  • 渲染模板,生成静态html文件
  • 将形成商品类别部分的数据封装成一个公共函数,放在goods/utils.py中
    获取商城商品分类菜单
  • 商品频道及分类菜单
  • 使用有序字典保存类别的顺序

用户浏览历史记录

历史记录只需保存多个商品的sku_id即可,而且需要保持添加sku_id的顺序,所以采用redis中的列表来保存,

  • 在配置文件中增加浏览历史记录的redis配置
  • 在users/serializers.py中实现序列化器
  • users/views.py文件中编写视图
  • 前端实现
    查看历史记录
  • 在users/views.py中UserBrowsingHistoryView视图补充get方法
  • 修改前端代码

商品列表页

获取商品列表数据

  • 在meiduo_mall/utils中创建pagination.py文件,在其中创建分页配置类
  • 在配置文件中设置REST framework分页使用的分页类
  • 在goods/views.py中实现视图
  • REST framework提供了对于排序的支持,使用REST framework提供的OrderingFilter过滤器后端即可。
    OrderingFilter过滤器要使用ordering_fields 属性来指明可以进行排序的字段有哪些。

商品搜索

我们引入搜索引擎来实现全文检索。全文检索即在指定的任意字段中进行检索查询。

  • 开源的 Elasticsearch 是目前全文搜索引擎的首选。
  • 使用Docker安装Elasticsearch及其扩展
  • 获取镜像,修改elasticsearch的配置文件 elasticsearc-2.4.6/config/elasticsearch.yml第54行,更改ip地址为本机ip地址,创建docker容器运行
  • 使用haystack对接Elasticsearch
  • 安装
  • 注册应用
  • 在配置文件中配置haystack使用的搜索引擎后端
  • HAYSTACK_SIGNAL_PROCESSOR 的配置保证了在Django运行起来后,有新的数据产生时,haystack仍然可以让Elasticsearch实时生成新数据的索引
  • 创建索引类,在goods应用中新建search_indexes.py文件,用于存放索引类
  • 在templates目录中创建text字段使用的模板文件
  • 手动生成初始索引
  • 创建序列化器
  • 创建视图
  • 定义路由
  • 测试

购物车部分

  • 在用户登录和未登录的情况下,都可以保存用户的购物信息
  • 用户可以对购物车进行增删改查
  • 用户对于购物车数据的勾选也要保存,在订单结算页面会使用勾选数据
  • 用户登录时,合并cookie中的购物车数据到redis中
  • 对于未登录的用户,购物车数据使用浏览器cookie保存
  • 对于登录的用户,购物车数据在后端使用redis保存

购物车数据存储

  • 在配置文件中增加用于保存购物车的Redis配置
  • 在cookie中只能保存字符串数据,所以将上述数据使用pickle进行序列化转换 ,并使用base64编码为字符串,保存到cookie中。

pickle模块的使用

pickle模块是python的标准模块,提供了对于python数据的序列化操作,可以将数据转换为bytes类型,其序列化速度比json模块要高。

  • pickle.dumps() 将python数据序列化为bytes类型
  • pickle.loads() 将bytes类型数据反序列化为python的数据类型
    python标准库中提供了base64模块,用来进行转换
  • base64.b64encode() 将bytes类型数据进行base64编码,返回编码后的bytes类型
  • base64.b64deocde() 将base64编码的bytes类型进行解码,返回解码后的bytes类型

添加到购物车

因为前端可能携带cookie,为了保证跨域请求中,允许后端使用cookie

  • 创建新的应用carts
  • 在carts/serializers.py文件中创建序列化器

查询购物车数据

  • 创建新的序列化器
  • 修改views视图,增加get方法

修改购物车数据

修改视图,添加put方法

删除 购物车数据

  • 新建序列化器
  • 修改视图,增加delete方法

购物车全选

  • 新建序列化器
  • 在views文件中新建视图

登录合并购物车

在用户登录时,将cookie中的购物车数据合并到redis中,并清除cookie中的购物车数据。
普通登录和QQ登录都要合并,所以将合并逻辑放到公共函数里实现。
在carts/utils.py中创建merge_cart_cookie_to_redis方法

  • 修改视图函数,重写类视图里的post方法来添加合并逻辑
  • 修改路径urls
  • 修改qq登录视图

订单部分

订单结算

  • 在serializers文件中新建序列化器
  • 在视图文件中编写视图函数

保存订单

  • 在orders/views中创建视图
  • 创建序列化器

保存订单的思路

  • 获取当前下单的用户
  • 生成订单编号
  • 保存订单基本信息数据orderInfo
  • 从redis中获取购物车结算的商品数据
  • 遍历结算商品
    - 判断商品库是否充足
    - 减少商品库存,增加商品销量
    - 保存订单商品数据
    - 在redis’购物车中删除已计算商品数据

数据库事务

在保存订单数据中,涉及到多张表(OrderInfo、OrderGoods、SKU)的数据修改,对这些数据的修改应该是一个整体事务,即要么一起成功,要么一起失败。
并发处理:

  • 悲观锁
  • 乐观锁
  • 任务队列
    使用乐观锁改写下单逻辑
    修改MySQL的事务隔离级别

支付宝支付

创建新的应用payment

使用沙箱环境来模拟支付环境
支付流程
![enter description here][5]在这里插入图片描述

接入步骤:

  • 创建应用
  • 配置密钥
  • 搭建和配置开发环境
  • 接口调用

配置密钥

  • 生成应用的私钥和公钥
  • 保存应用私钥文件
    • 在payment应用中新建keys目录,用来保存秘钥文件。
    • 将应用私钥文件app_private_key.pem复制到payment/keys目录下。
  • 查看公钥 :cat app_publict_key.pem. 并将公钥复制给支付宝
  • 保存支付宝公钥

发起支付

  • 首先创建视图
  • 在配置文件中编辑支付宝的配置信息

保存支付结果

  • 用户支付成功后,支付宝会将用户重定向到http://www.meiduo.site:8080/pay_success.html,并携带支付结果数据
  • 前端页面将此数据发送给后端,后端检验并保存支付结果

Xadmin

xadmin是Django的第三方扩展,可是使Django的admin站点使用更方便。

  • 安装
  • 在配置文件中注册应用
  • xadmin有建立自己的数据库模型类,需要进行数据库迁移
  • 在总路由中添加xadmin的路由信息

用户权限限制

在产品运营平台中,是需要对用户进行权限控制的。Django实现了用户权限的控制

数据库读写分离

Mysql主从同步

  • 主从同步定义
    主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。因为复制是异步进行的,所以从服务器不需要一直连接着主服务器,从服务器甚至可以通过拨号断断续续地连接主服务器。通过配置文件,可以指定复制所有的数据库,某个数据库,甚至是某个数据库上的某个表。
  • 主从同步的好处
    • 主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。因为复制是异步进行的,所以从服务器不需要一直连接着主服务器,从服务器甚至可以通过拨号断断续续地连接主服务器。通过配置文件,可以指定复制所有的数据库,某个数据库,甚至是某个数据库上的某个表。
    • 提高数据安全,因为数据已复制到从服务器,从服务器可以终止复制进程,所以,可以在从服务器上备份而不破坏主服务器相应数据
      提高数据安全,因为数据已复制到从服务器,从服务器可以终止复制进程,所以,可以在从服务器上备份而不破坏主服务器相应数据
    • 在主服务器上生成实时数据,而在从服务器上分析这些数据,从而提高主服务器的性能
  • 配置主从的步骤
    • 在主服务器上,必须开启二进制日志机制和配置一个独立的ID
    • 在每一个从服务器上,配置一个唯一的ID,创建一个用来专门复制主服务器数据的账号
    • 在开始复制进程前,在主服务器上记录二进制文件的位置信息
    • 如果在开始复制之前,数据库中已经有数据,就必须先创建一个数据快照(可以使用mysqldump导出数据库,或者直接复制数据文件)
    • 配置从服务器要连接的主服务器的IP地址和登陆授权,二进制日志文件名和位置
  • 详细配置主从同步
    • 获取mysql的镜像,主从同步尽量保证多台mysql的版本相同,运行mysql docker镜像,
    • 备份主服务器原有数据到从服务器
    • 配置主服务器master(Ubuntu中的MySQL)
    • 配置从服务器slave (docker中的mysql)

配置Django实现数据库读写分离

django在进行数据库操作的时候,读取数据与写数据(增、删、改)可以分别从不同的数据库进行操作

  • 在配置文件中增加slave数据库的配置
  • 创建数据库操作的路由分发类
  • 在配置文件中增加读写分离路由

项目部署

静态文件

当Django运行在生产模式时,将不再提供静态文件的支持,需要将静态文件交给静态文件服务器。

  • 将front_end_pc中的讲台文件和django自带的静态文件,集中到静态服务器中,创建目录static
  • 使用Nginx服务器作为静态文件服务器
  • 重启Nginx服务器

动态接口

在项目中复制开发配置文件dev.py 到生产配置prod.py,并修改该文件

  • django的程序通常使用uwsgi服务器来运行
  • 先进行安装
  • 创建uwsgi配置文件:uwsgi.ini
  • 启动uwsgi服务器,
  • 修改Nginx配置文件,让Nginx接收到请求后转发到uwsgi服务器
  • 重启nginx
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章