Flask项目之手机端租房网站的实战开发(三)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家!
接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/85623829
目录
一丶关于在项目中循环导入的问题
1.在上一篇中创建api_1_0蓝图下的demo.py视图函数文件中,肯定会用到导入数据库db的,那么就会出现flask项目循环导包的问题,当启动项目时,会提示cannot import name db,这个提示就是代表循环导入包的问题
2.针对flask项目出现此问题的解决方法
- step1 分析导包流程,首先在manage.py启动文件中,程序从上往下执行,一开始就从ihome包下导入数据库连接对象db,然后进入到ihome\init.py文件中,同理执行到从ihome导入蓝图目录api_1_0时,即进入api_1_0\init.py文件中,执行到导入相对路径下demo文件时,回到demo.py文件中,在该文件中从ihome包下导入db时,就会发现此时在ihome\init.py文件中,并还没有执行到创建数据库db对象,所以程序执行到这一步时,就会提示以上错误
- step2 解决方法,选择推迟导入,修改代码在什么时候需导入api_1_0时,我们就在什么后导入即可,发现在create_app方法中在注册蓝图的时候才需要导入api_1_0,所以将导入代码,放到此处即可
# 注册蓝图
from ihome import api_1_0
app.register_blueprint(api_1_0.api, url_prefix="/api/v1.0")
- step3 再次启动项目,就不会提示cannot import name db 了,成功解决flask项目中循环导入包的问题
3.一个完整的项目工程还需要在核心目录下创建项目所需的目录,用来分别存放包和库的,所以需在ihome目录下创建utils目录用来存放项目所需的工具包以及工具函数等,然后再创建一个libs目录用来存放第三方的库,不是通过pip install 安装的库,而是源码安装的库,这样才是完整的实战工程项目
二丶日志功能实现
1.一个正常的网站包括软件等,都会有日志来记录历史操作信息等,在公司中一般会将存放日志目录与工程目录隔离开,这里为了方便演示,即将日志目录和工程目录放到一起,在项目根目录创建logs目录,用来存放日志文件
2.因为flask框架没有去提供日志这一块的库以及工具,所以我们就是用python记录日志标准库logging来进行日志记录保存
- step1 在ihome/init文件中导入logging库
import logging
- step2 并配置日志信息以及设置日志等级
- step3 配置后日志信息后,需要在api_1_0/demo视图函数中进行记录日志,有两种方法,第一种是直接在demo文件中使用logging标准库模块,第二种是使用flask 框架中的全局上下文current_app对象,为什么能使用current_app对象,因为这个对象把logging模块中的logger塞到了这个对象中了
- step4 启动项目,在浏览器输入http://127.0.0.1:5000/api/v1.0/index测试日志是否成记录并写入到logs目录下的log文件中
成功在logs目录下创建log日志文件,并将日志信息写入到该文件中
注: 在开发环境develop中配置了DEBUG=True调试模式下,会导致我们配置的日志等级,不生效,flask会强制忽略到我们配置的日志信息
三丶项目数据库设计
1.分析项目所需要的表
- step1 用户表User,先从注册界面来说,需要哪些字段(user_id,作为主键,手机号mobile,用户名name,密码password,存放头像的路径avatar_url,用户真实姓名real_name,真实身份证号real_id_card,验证码图片存到redis数据库即可)
- step2 房子表House,字段(house_id,作为主键,user_id,与用户表主键id保持一致,作为外键关联哪个用户的房子,一个用户有多套房子一对多关系,房子标题title,房子所在区域area_name,通过创建的Area表所以这里将area_name改为area_id通过外键来查询即可)
- 思考:当查询房屋表中某个区域的数据时,select distinct area_name from house并去重,当数据很少的时候可以这样进行查询,随着时间推移导致数据达到几千万时,那么通过这样的方式查询数据,时间就会很长,不利于用户体验,所以这里需再创建一个区域表Area来解决查询时间过长的问题
- step3 区域表Area,字段(area_id,作为主键,name区域名,price价格,image_url1,image_url2...),Area表对于House表也是一对多关系,一个区域多个房子
- 思考:在第四步我们将图片链接地址存到Area表中,那么今后如果用户上传图片扩大为10张,那么就需要改表结构,这样不是明智的选择,所以另建一个House_Image表来存储用户上传的房屋图片
- step4 房屋图片表House_Image,字段(image_id,作为主键,url图片地址,house_id外键),房子House表对于图片地址House_Image表一对多关系,一个房子有多张图片
- 思考:分析需求,发现只有房屋详情时才会查询多张图片,而在查询列表和主页图片时,只需要一张,那么我们在房子表House中需添加一个index_image_url字段,这样做的目的是减少关联查询,在数据库中以空间换时间的理念来减少查询时间
- step5 房屋配套设施表Facility,字段(facility_id,作为主键,name设施名字)
- 思考:设施表Facility与房屋表House是多对多关系,一个设施如冰箱可以在多个不同房子中拥有,一个房子同时也可以拥有多个设备设施如电视,空调,wifi等,那么存储多对多关系的表数据,就需要创建一个中间表
- step6 创建中间表House_Facility表,字段(id,作为主键,外键house_id和facility_id)
- step7 客户订单表Order,字段(order_id,作为主键,外键user_id哪个用户和house_id哪个房子,create_time订单创建时间,start_date入住日期,end_date离开日期,price房屋单价,amount合计金额,days入住天数,status订单状态,comment评价)
- 思考1:之所以要在Order订单表中创建price字段是考虑到比如房东在第二天需要将房屋价格上涨或者下降,保证用户是按实时价格进行计算的,加入amount不仅是为了前端,重要的是为了后期运营人员进行统计方便,节省统计的开销
- 问题:关于房东拒绝订单是否填写拒绝原因,设定是必须填写拒绝原因,那么是需要在Order 表中添加一个字段么?
- 分析:因为一旦填写拒绝原因那么就不存在comment评价了,所以这拒绝原因和评价两个关系为互斥关系,所以我们这里不添加拒绝原因字段,当有了评论信息那么肯定就不会出现拒绝原因,可以通过订单状态status来判断是评价还是拒绝原因
- 思考2: 当在房源搜索房屋的时候,会出现按照最新上线,入住最多,价格高低排序,当按照入住最多排序时,那么就是相当于按照订单量最多的房屋进行排序,那么就需要在Order表中按照订单量来进行排序,首先就需要根据入住时间和区域来来进入过滤查询,还要将查询的结果安装订单量进行排序,这样查询代价就比较大了,那么同理还是使用以空间换时间的概念,在House表中添加order_count来订单量,当没下一单就在对应的order_count的值加1,回过来通过直接查询House表中的order_count字段按大小排序就能查询到订单最多的房屋了
2.在models.py中创建数据库抽象模型类
- step1 定义BaseModel模型基类,用于为每个模型添加创建时间和更新时间
- step2 定义User用户表
- step3 定义Area城区表
- step4 定义House房屋表
- step5 定义Facility设施表
- step6 定义HouseImage房屋图片表
- step7 定义Order订单表
四丶数据库迁移
- step1 初始化数据库对象db
- step2 执行迁移文件,结果提示No change in.....
- 解决:因为models.py文件对于其他文件来说,并不知道它的存在,所以只需要在视图文件demo中导入models即可
from ihome import db, models
- step3 再次执行迁移 ,则显示迁移成功
- step4 执行升级,将数据写入到mysql中的ihome_python数据库中
- step5 以上步骤完成后,进入mysql,使用ihome_python数据库,查询数据库表成功生成
Flask项目之手机端租房网站的实战开发(三)的更多相关文章
- Flask项目之手机端租房网站的实战开发(一)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 一丶项目介绍 产品:关于手机移动端的租房网站 角色:在这个产品中用户包括房东与房客 功能:房东可以在这个平台发布自己的房屋,房客可 ...
- Flask项目之手机端租房网站的实战开发(二)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...
- Flask项目之手机端租房网站的实战开发(十四)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...
- Flask项目之手机端租房网站的实战开发(六)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...
- Flask项目之手机端租房网站的实战开发(十一)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...
- Flask项目之手机端租房网站的实战开发(十)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...
- Flask项目之手机端租房网站的实战开发(九)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...
- Flask项目之手机端租房网站的实战开发(八)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...
- Flask项目之手机端租房网站的实战开发(四)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...
随机推荐
- Dcloud+mui 压缩上传图片到服务器
chooseImgFromAlbums选择图片 chooseImgFromPictures 拍照 changeToLocalUrl 转换成可用的路径 uploadpic.compressImg 压缩图 ...
- HDU——T 1166 敌兵布阵
http://acm.hdu.edu.cn/showproblem.php?pid=1166 Time Limit: 2000/1000 MS (Java/Others) Memory Limi ...
- VIjos——V 1782 借教室 | | 洛谷——P1083 借教室
https://vijos.org/p/1782|| https://www.luogu.org/problem/show?pid=1083 描述 在大学期间,经常需要租借教室.大到院系举办活动,小到 ...
- C# ArcGIS Engine 使当前选中的操作失效(清除当前鼠标事件)
问题描述: 前提:我用的ENGINE9.3开发,拖了一个ToolbarControl控件,加了一些常用操作的工具(平移,放大,缩小)在上边. 问题:我做了一个增加点的按钮.当我平移完地图之后,点击增加 ...
- 数据库优化技巧之in和not in
在编写SQL语句时,假设要实现一张表有而另外一张表没有的数据时. 通常第一直觉的写法是: select * from table1 where table1.id not in(select id f ...
- 4. Brackets 前端编辑器试用
转自:https://blog.csdn.net/wuji3390/article/details/71170579 Brackets编辑器介绍 "一个现代的,开源的,了解网页设计的编辑器& ...
- js的类和继承
因为我使用java语言入门的编程,所以对javascript的类和继承有种想当然一样,或者是差不多的感觉,但实际上两者还是有很多不同的 首先我们说类,javascript中类的实现是基于原型继承机制的 ...
- arping---发送arp请求到一个相邻主机
arping命令是用于发送arp请求到一个相邻主机的工具,arping使用arp数据包,通过ping命令检查设备上的硬件地址.能够测试一个ip地址是否是在网络上已经被使用,并能够获取更多设备信息.功能 ...
- userdel---删除用户及相关文件
userdel命令 userdel命令用于删除给定的用户,以及与用户相关的文件.若不加选项,则仅删除用户帐号,而不删除相关文件. 语法 userdel(选项)(参数) 选项 -f:强制删除用户,即 ...
- 洛谷——P1314 聪明的质监员
https://www.luogu.org/problem/show?pid=1314 题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每 ...