Flask租房项目总结
该Flask项目历时3天,开发小组6人,目的是开发一个租房web项目,该项目采用前后端分离模式。
Flask租房项目总结
分析需求文档,需要完成的功能模块有:
登陆注册
首页展示,首页搜索
详情展示,订单预定
个人中心的用户信息修改
我的订单展示,客户订单展示
我的房源,上传图片和实名认证
该项目是前后端分离的项目,后端需要根据接口文档的要求,对数据库进行增加,修改,删除,查询的操作
根据需求分析E-R图,为构建模型类做准备:
模型类构建完毕,进行数据库迁移和测试数据的添加
小组项目分工,将项目分为6个模块,每个模块相对独立,小组成员独立完成。每过半日,进行临时小组会议,汇报进度和遇到的问题。
项目中犯的错误:
没有严格按照接口文档的url路径写接口。比如接口路径:/api/v1.0/houses/<int:house_id>,为了方便在Blueprint中添加了url_preifx=/api/v1.0/,导致前端静态文件路径出错,不得不修改前端路径,犯了大忌。当然也可以创建2个蓝图对象来解决问题,一个用来返回静态资源,一个用来做视图函数,以下采取这种方法。
测试功能时,因为客户订单没有数据,误以为代码有bug,在客户订单接口上花费太长时间。
项目分工不合适,组内成员代码水平差异大,导致工作压力不均衡。
没有写任何单元测试。
项目遇到的bug:
avtar_url网址返回给前端时没有加上七牛云地址
query抄写为quary
时间单位直接相减
返回数据格式不正确等
项目逻辑实现:
创建蓝图对象,为了返回静态资源和视图函数:
# 1. 创建蓝图
html_blu = Blueprint("html", __name__)
# 访问静态文件
@html_blu.route('/<path:file_name>')
def get_html_file(file_name):
# 判断是否是网站的Logo,如果不是,添加前缀
if file_name != "favicon.ico":
file_name = "html/" + file_name
return current_app.send_static_file(file_name)# 创建 /api/v1.0 接口的蓝图
api_blu = Blueprint("api", __name__, url_prefix="/api/v1.0")
注册:
获取前端发送的UUID
借助captcha生成图片验证码,储存在redis中
返回带有图片验证码的响应体对象
前端点击发送短信验证码,获取前端发送的UUID,image_code,mobile
检验数据,使用UUID取出验证码和image_code做对比
借助云通讯发送短信,将短信内容sms_code存储在redis中
前端点击注册按钮,获取前端发送的mobile,sms_code,password
检验数据,对比sms_code和redis中存储短信内容
初始化user模型对象,添加一条新的用户记录
实现状态保持
登录/退出登录:
获取mobile,password参数,检验参数
查询对应的用户对象,实现状态保持
退出登录即是清除session中存储的状态保持
我发布的房屋列表:
获取登录的user_id
查询用户所有的房屋对象,返回房屋信息
发布房源/上传房源图片
获取前端发送的参数,并做参数校检
在房屋-设施多对多关系表添加记录
house.facilities.append(facility_list)
保存house模型对象到数据库
获取前端发送的图片,根据house_id判断房屋是否存在
上传图片在七牛云储存
房屋图片表存储图片相对地址,返回数据
首页展示内容:
以订单量降序的方式查询房屋
houses = House.query.order_by(House.order_count.desc()).limit(constants.HOME_PAGE_MAX_HOUSES).all()
houses_list = [house.to_basic_dict() for house in houses]
搜索房屋列表
获取前端参数:aid,start_time,end_time,sort_key,page
参数检验,结束时间要大于开始时间
查询对象和增加过滤条件
house_query = House.query
filters = []
filters.append(House.area_id == area_id)过滤已预定的房屋
conflict_order = Order.query.filter(Order.begin_date<=end_date, Order.end_date>=start_date).all()
conflict_house_id = [order.house_id for order in conflict_order]
filters.append(House.id.notin_(conflict_house_id))根据筛选条件进行排序
house_query = house_query.
filter(*[filters]).order_by(House.order_count.desc())进行分页展示,返回数据
paginate = house_query.
paginate(int(page),constants.HOUSE_LIST_PAGE_CAPACITY, False)
houses = paginate.items
total_page = paginate.pages
下单/预定房间
获取参数user_id,house_id,start_date,end_date,检验参数
查询房屋对象是否存在,判断用户是否是房东,判断房屋是否有冲突订单
filters = [Order.house_id == house_id,
Order.begin_date < end_date, Order.end_date > begin_date]
count = Order.query.filter(*filters).count()生成订单模型,存储在order表,返回结果
获取订单列表
获取当前角色标识,[custom,landlord]
房客订单查询
orders = Order.query.filter(Order.user_id
== user_id).order_by(Order.create_time.desc()).all()房东订单查询
houses = House.query.filter(House.user_id == user_id).all()
houses_id = [house.id for house in houses]
orders = Order.query.filter(Order.house_id in_(houses_id)).filter_by(Order.create_time.desc()).all()
接单/拒单/评论订单(略)
用户中心(略)
项目注意点:
大量的参数检验,不同功能模块,前端、后端内都要进行参数检验,保证参数准确性。
通过将每一次查询后的结果储存在redis中可以提高用户下次查询相同结果的效率,能够提高用户体验。
Flask租房项目总结的更多相关文章
- 巡风代码架构简介以及Flask的项目文件结构简介
一.巡风: 巡风是一款什么东西,想必安全同行都不陌生吧.用它作为内网漏洞扫描管理架构是一种很好的选择,扫描快,开源,还可自己编写符合规则的POC直接放入相应目录来扩展.今天下午趁着有点时间捋了一下巡风 ...
- Python+Flask+Gunicorn 项目实战(一) 从零开始,写一个Markdown解析器 —— 初体验
(一)前言 在开始学习之前,你需要确保你对Python, JavaScript, HTML, Markdown语法有非常基础的了解.项目的源码你可以在 https://github.com/zhu-y ...
- Flask大型项目框架结构理解
导语:前段时间学习狗书的flask大型项目框架结构的时候有点混乱,到现在也知道是个啥了,想着,把关系理一理,写一篇博客.也方便后来学习的人查阅.以下是我创建项目时候的结构. myproject --- ...
- Python之Flask框架项目Demo入门
Python+Flask框架项目Demo入门 本例子用到了 Flask+蓝图+Flask-Login+SQLAlchemy+WTForms+PyMySQL相关架构 Flask Web框架介绍 Flas ...
- JavaEE在职加薪课好客租房项目实战视频教程
JavaEE在职加薪课好客租房项目实战视频教程课程介绍: 本课程采用SOA架构思想进行设计,基于目前主流后端技术框架SpringBoot.SpringMVC.Mybaits.Dubbo等来 ...
- 【Flask】 项目结构说明
项目结构 Flask的一大优势就是其极其轻量化.但是也需要注意到,如果我们要用Flask做一个大项目的话,把所有代码写在一个文件里肯定是不合适的.非常难以维护.但是和Django这种框架又不一样,Fl ...
- Flask速成项目:Flask实现计算机资源的实时监控
很多人都说使用Python开发WEB应用非常方便,那么对于WEB新手来说,到底有多方便呢?本文即将展示给你Python的魔法. 本文将通过一个实例:Flask实现计算机资源的实时监控,迅速带你入门Fl ...
- Flask之项目配置,目录构建,闪现
综合案例:学生成绩管理 新建项目目录students,并创建虚拟环境 mkvirtualenv students 安装开发中使用的依赖模块 pip install flask==0.12.4pip i ...
- Flask之项目创建,路由以及会话控制
Flask Flask诞生于2010年,是Armin ronacher(人名)用 Python 语言基于 Werkzeug 工具箱编写的轻量级Web开发框架. Flask 本身相当于一个内核,其他几乎 ...
随机推荐
- elixir 表单 map
键-值对 iex(13)> map = %{:a => 1, 2 => :b}%{2 => :b, :a => 1}iex(14)> map[:a]1iex(15) ...
- VMware与Hyper-V
前段时间在Windows10上安装Hyper-V,使用docker时,提示要卸载VMware 今天重新安装VMware时,提示: 根据连接进去:https://kb.vmware.com/s/arti ...
- leetCode题解之求二叉树每层的平均值
1.题目描述 Given a non-empty binary tree, return the average value of the nodes on each level in the for ...
- Vue2学习笔记:v-for指令
1.使用 <!DOCTYPE html> <html> <head> <title></title> <meta charset=&q ...
- win7 下安装oracle 10 g
首先下对版本,Oracle 10g支持Win7版: http://download.oracle.com/otn/nt/oracle10g/10203/10203_vista_w2k8_x86_pro ...
- Linux blkid命令详解
blkid命令对查询设备上所采用文件系统类型进行查询.blkid主要用来对系统的块设备(包括交换分区)所使用的文件系统类型.LABEL.UUID等信息进行查询.要使用这个命令必须安装e2fsprogs ...
- ZT 9种排序
9种排序 2012-09-19 14:58 66人阅读 评论(0) 收藏 编辑 删除 algorithmfpfilemergeintegerfloat [cpp] view plaincopy #in ...
- 【ASP.NET】#001 获取服务器IP
客户端ip: Request.ServerVariables.Get("Remote_Addr").ToString(); 客户端主机名: Request.ServerVariab ...
- 对象在hibernate中的状态
首先hibernate中对象的状态有三种:瞬态.游离态和持久态,三种状态转化的方法都是通过session来调用,瞬态到持久态的方法有save().saveOrUpdate().get().load() ...
- Avito Code Challenge 2018
第一次打CF,很菜,A了三道水题,第四题好像是是数位DP,直接放弃了.rateing从初始的1500变成了1499,还是绿名,这就很尴尬.之后觉得后面的题目也没有想象的那么难(看通过人数)过两天吧剩下 ...