爱家租房项目④-项目总结与优化

文章目录

  • 技术文档
    • 存储服务
    • 前端模板
  • 项目优化
    • 01_csrf_token缺失bug的解决
    • 02_数据库优化介绍1
      • 表结构设计
      • Django优化
        • 数据库优化
        • 外键保证数据的完整性
        • 当数据量大的时候,需要去除外键
        • 慢查询:
        • mysql主从:读写分离,热备份。主库(写:增删改) 从库(读: 查询)
        • 数据库索引概念
  • 项目总结
    • 项目需求
    • 项目结构
    • 相关技术
    • 简要开发步骤
    • 新环境中运行步骤

技术文档

爱家租房项目④-项目总结与优化_第1张图片

存储服务

在这里插入图片描述

前端模板

http://aui.github.io/art-template/docs/index.html

在这里插入图片描述

项目优化

01_csrf_token缺失bug的解决

flask项目是用flask_wtf的csrf 创建的csrf_token的时候,自动会在session中存放一个值,项目的session存放在redis中,则redis中存在该值。
在cookie中,前开发工程师也把csrf_token存放了一份在cookie中,

#创建一个csrf_token值
csrf_token=csrf.generate_csrf()
# 设置cookie值
resp.set_cookie("csrf_token", csrf_token)

flask_wtf的CSRFProtect(app)进行保护的时候,实则是从session中读取csrf_token值,与前端请求数据中的headers中传过来的csrf_token进行比较。
当退出清除session时,csrf_token值也一起删除了,而浏览器再次加载页面时,由于浏览器缓存机制,是通过浏览器的缓存访问页面,并未经过后台,所以不会再生成csrf_token,也不会存放在redis的session中,导致csrf机制报错.
当然,清空缓存,刷新后,则可以再次登录,但这不是个解决办法。
在不破坏原有代码体系上,即 依旧使用flask_wtf的csrf机制,
可以在清空session前,获取csrf_token的值,清空后再加上。

退出登录时,执行

csrf_token=session.get('csrf_token')
session.clear()
session['csrf_token']=csrf_token

爱家租房项目④-项目总结与优化_第2张图片

02_数据库优化介绍1

表结构设计

  • 用空间换时间:适当增加冗余字段节省查询开销,如设计房屋出租总数,按其排序
  • 三范式:
    爱家租房项目④-项目总结与优化_第3张图片

Django优化

数据库优化

将orm模型类的查找慢的,手写Sql,
使用索引,sql语句遵循关键字最左原则
联合索引要求更严格,要求顺序跟建表时一样
爱家租房项目④-项目总结与优化_第4张图片

外键保证数据的完整性

父表无法删除其内容,因为有外键所在的子表。如果想删除父表中的记录,可以使用cascade级联,父表某一值删除,直接删除与其关联的全部数据。

当数据量大的时候,需要去除外键

原因:索引与外键中,查询、关联提高,但是维护外键需要额外的开销,影响性能

慢查询:

https://www.cnblogs.com/yfbk/p/9761866.html
https://www.jianshu.com/p/ca0e48d83130

mysql主从:读写分离,热备份。主库(写:增删改) 从库(读: 查询)

数据库索引概念

索引存放在磁盘额位置,通过查询位置找到数据的物理位置(数据的存储方式如下图),增删改是需改变数据存储位置,降低性能爱家租房项目④-项目总结与优化_第5张图片
分库分表
爱家租房项目④-项目总结与优化_第6张图片

项目总结

项目需求

  1. 用户模块

    • 注册
      • 用户账号默认为手机号
      • 图片验证码正确后才能发送短信验证码
      • 短信验证码每60秒可发送一次(redis缓存有效期 + celery异步发送短信)
      • 每个条件出错时有相应错误提示
    • 登录
      • 用手机号与密码登陆
      • 错误时有相应提示
    • 登出
      • 用户退出,清除session(此处由于CSRFProtect从session或获取csrf_token,所以退出时需要保留session中的csrf_token)
    • 实名认证
      • 实名认证只可进行一次
      • 提交认证信息后再次进入只能查看信息,不能修改
      • 认证信息包含姓名与身份证号
    • 个人信息修改
      • 可以修改个人头像
      • 可以修改用户名
      • 登陆手机号不能修改
      • 上传头像与用户名分开保存
      • 上传新头像后页面理解显示新头像
    • 我的爱家
      • 显示个人头像、手机号、用户名(用户名未设置时为用户手机号)
      • 提供修改个人信息的入口
      • 提供作为房客下单的查询入口
      • 提供成为房东所需实名认证的入口
      • 提供作为房东发布房屋信息的入口
      • 提供作为房东查询客户订单的入口
      • 提供退出的入口
  2. 房源模块

    • 主页
      • 最多5个房屋logo图片展示,点击可跳转至房屋详情页面
      • 提供登陆/注册入口,登陆后显示用户名,点击可跳转至个人中心
      • 用户可以选择城区、入住时间、离开时间等条件进行搜索
      • 城区的区域信息需动态加载
      • 最多5个房屋logo图片展示,点击可跳转至房屋详情页面
      • 提供登陆/注册入口,登陆后显示用户名,点击可跳转至个人中心
      • 用户可以选择城区、入住时间、离开时间等条件进行搜索
      • 城区的区域信息需动态加载
    • 发布房源
      • 需要用户填写全部房屋信息
      • 房屋的文字信息与图片分开操作
    • 我的房源(显示用户房源)
      • 未实名认证的用户不能发布新房源信息,需引导到实名认证页面
      • 按时间倒序显示已经发布的房屋信息
      • 点击房屋可以进入详情页面
      • 对实名认证的用户提供发布新房屋的入口
    • 房屋列表
      • 可根据入住离开时间、区域进行筛选,并可进行排序
      • 房屋信息分页加载
      • 区域信息动态加载
      • 筛选条件更新后,页面立即刷新
    • 房屋详情
      • 需展示的详细信息参考设计图
      • 提供预定入口
      • 若是房东本人查看房屋信息时,预定入口不显示
    • 房屋预订
      • 由用户确定入住时间
      • 根据用户确定的入住离开时间实时显示合计天数与总金额
      • 房东不可预订自己房源
  3. 订单模块

    • 我的订单(房客角色)
      • 按时间倒序显示订单信息
      • 订单完成后提供评价功能
      • 已评价的订单能看到评价信息
      • 被拒绝的订单能看到拒单原因
    • 客户订单(房东角色)
      • 按时间倒序显示用户下的订单
      • 对于新订单提供接单与拒单的功能
      • 拒单必须填写拒单原因
      • 若客户进行了订单评价,需显示
  4. 支付模块

    • 接入支付宝支付平台
      • 用户点击支付后跳转到支付宝支付页面(有app的直接打开app)
      • 支付完成后,回到订单页面,并更改订单状态

项目结构

ihome                   # 总项目目录
├── README.md
├── config.py           # 项目配置文件
├── ihome               # 业务文件包, 包含项目的业务黛安
│   ├── __init__.py
│   ├── blueprints          # 蓝图
│   │   ├── __init__.py
│   │   └── view.py         # 蓝图视图
│   ├── db.py               # 数据库配置
│   ├── libs                # 不通过pip,额外导入的工具文件
│   ├── models.py           # 模型
│   ├── static              # 静态文件夹
│   └── utils               # 自定义的工具文件夹
├── manage.py               # 包装的利用命令行启动项目的文件
└── setup.py                # 部署文件

相关技术

  • 主题框架使用flask框架,前后端分离的设计模式
  • mysql数据库,利用flask-sqlalchemy插件链接
  • 利用flask-script插件进行命令行操作, flask-migrate进行数据库迁移
    1. python mnange.py runserver 启动程序
    2. python manage.py db migrate -m ‘生成迁移文件’
    3. python manage.py db upgrade 迁移数据库
  • 利用flask-session + redis 进行session管理
  • 利用 falsk-wtf 进行 csrf 保护
  • 支付模块接入支付宝开放平台进行支付, 使用 python-alipay-sdk 包
  • 用户上传的图片和文件托管到 七牛云
  • 用户发送短信验证码使用 容联云平台
  • 发送短信验证码使用 celery 异步

简要开发步骤

  1. 分析项目需求
  2. 搭建项目文件目录结构
  3. 进行数据库设计
  4. 编写静态文件蓝图
  5. 用户模块
  6. 房屋模块
  7. 订单模块
  8. 支付模块
  9. 项目优化

新环境中运行步骤

  1. 运行 pip install -r requirements.txt 安装需要的python包

  2. 安装 mysql 和 redis 数据库,并在mysql中创建ihome数据库

  3. 修改项目中数据库配置文件

    爱家租房项目④-项目总结与优化_第7张图片

  4. 使用 python manage.py db migrate -m '生成数据库迁移文件'

  5. 使用 python manage.py db upgrade 迁移数据库

  6. 启动 redis 服务 redis-server /etc/redis.conf

  7. 启动项目 py manage.py runserver

你可能感兴趣的:(#,Flask)