文章目录
技术文档
存储服务
前端模板
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
02_数据库优化介绍1
表结构设计
- 用空间换时间:适当增加冗余字段节省查询开销,如设计房屋出租总数,按其排序
- 三范式:
Django优化
数据库优化
将orm模型类的查找慢的,手写Sql,
使用索引,sql语句遵循关键字最左原则
联合索引要求更严格,要求顺序跟建表时一样
外键保证数据的完整性
父表无法删除其内容,因为有外键所在的子表。如果想删除父表中的记录,可以使用cascade级联,父表某一值删除,直接删除与其关联的全部数据。
当数据量大的时候,需要去除外键
原因:索引与外键中,查询、关联提高,但是维护外键需要额外的开销,影响性能
慢查询:
https://www.cnblogs.com/yfbk/p/9761866.html
https://www.jianshu.com/p/ca0e48d83130
mysql主从:读写分离,热备份。主库(写:增删改) 从库(读: 查询)
数据库索引概念
索引存放在磁盘额位置,通过查询位置找到数据的物理位置(数据的存储方式如下图),增删改是需改变数据存储位置,降低性能
分库分表
项目总结
项目需求
-
用户模块
- 注册
- 用户账号默认为手机号
- 图片验证码正确后才能发送短信验证码
- 短信验证码每60秒可发送一次(redis缓存有效期 + celery异步发送短信)
- 每个条件出错时有相应错误提示
- 登录
- 用手机号与密码登陆
- 错误时有相应提示
- 登出
- 用户退出,清除session(此处由于CSRFProtect从session或获取csrf_token,所以退出时需要保留session中的csrf_token)
- 实名认证
- 实名认证只可进行一次
- 提交认证信息后再次进入只能查看信息,不能修改
- 认证信息包含姓名与身份证号
- 个人信息修改
- 可以修改个人头像
- 可以修改用户名
- 登陆手机号不能修改
- 上传头像与用户名分开保存
- 上传新头像后页面理解显示新头像
- 我的爱家
- 显示个人头像、手机号、用户名(用户名未设置时为用户手机号)
- 提供修改个人信息的入口
- 提供作为房客下单的查询入口
- 提供成为房东所需实名认证的入口
- 提供作为房东发布房屋信息的入口
- 提供作为房东查询客户订单的入口
- 提供退出的入口
- 注册
-
房源模块
- 主页
- 最多5个房屋logo图片展示,点击可跳转至房屋详情页面
- 提供登陆/注册入口,登陆后显示用户名,点击可跳转至个人中心
- 用户可以选择城区、入住时间、离开时间等条件进行搜索
- 城区的区域信息需动态加载
- 最多5个房屋logo图片展示,点击可跳转至房屋详情页面
- 提供登陆/注册入口,登陆后显示用户名,点击可跳转至个人中心
- 用户可以选择城区、入住时间、离开时间等条件进行搜索
- 城区的区域信息需动态加载
- 发布房源
- 需要用户填写全部房屋信息
- 房屋的文字信息与图片分开操作
- 我的房源(显示用户房源)
- 未实名认证的用户不能发布新房源信息,需引导到实名认证页面
- 按时间倒序显示已经发布的房屋信息
- 点击房屋可以进入详情页面
- 对实名认证的用户提供发布新房屋的入口
- 房屋列表
- 可根据入住离开时间、区域进行筛选,并可进行排序
- 房屋信息分页加载
- 区域信息动态加载
- 筛选条件更新后,页面立即刷新
- 房屋详情
- 需展示的详细信息参考设计图
- 提供预定入口
- 若是房东本人查看房屋信息时,预定入口不显示
- 房屋预订
- 由用户确定入住时间
- 根据用户确定的入住离开时间实时显示合计天数与总金额
- 房东不可预订自己房源
- 主页
-
订单模块
- 我的订单(房客角色)
- 按时间倒序显示订单信息
- 订单完成后提供评价功能
- 已评价的订单能看到评价信息
- 被拒绝的订单能看到拒单原因
- 客户订单(房东角色)
- 按时间倒序显示用户下的订单
- 对于新订单提供接单与拒单的功能
- 拒单必须填写拒单原因
- 若客户进行了订单评价,需显示
- 我的订单(房客角色)
-
支付模块
- 接入支付宝支付平台
- 用户点击支付后跳转到支付宝支付页面(有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进行数据库迁移
- python mnange.py runserver 启动程序
- python manage.py db migrate -m ‘生成迁移文件’
- python manage.py db upgrade 迁移数据库
- 利用flask-session + redis 进行session管理
- 利用 falsk-wtf 进行 csrf 保护
- 支付模块接入支付宝开放平台进行支付, 使用 python-alipay-sdk 包
- 用户上传的图片和文件托管到 七牛云
- 用户发送短信验证码使用 容联云平台
- 发送短信验证码使用 celery 异步
简要开发步骤
- 分析项目需求
- 搭建项目文件目录结构
- 进行数据库设计
- 编写静态文件蓝图
- 用户模块
- 房屋模块
- 订单模块
- 支付模块
- 项目优化
新环境中运行步骤
-
运行
pip install -r requirements.txt
安装需要的python包 -
安装 mysql 和 redis 数据库,并在mysql中创建ihome数据库
-
修改项目中数据库配置文件
-
使用
python manage.py db migrate -m '生成数据库迁移文件'
-
使用
python manage.py db upgrade
迁移数据库 -
启动 redis 服务
redis-server /etc/redis.conf
-
启动项目
py manage.py runserver