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 ...
随机推荐
- comm---两个文件之间的比较
comm命令可以用于两个文件之间的比较,它有一些选项可以用来调整输出,以便执行交集.求差.以及差集操作. 交集:打印出两个文件所共有的行. 求差:打印出指定文件所包含的且不相同的行. 差集:打印出包含 ...
- HDU 2883 kebab
kebab Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID: 2883 ...
- ArcGIS Engine中删除要素的几种方法总结
转自原文 ArcGIS Engine中删除要素的几种方法总结 /// <summary> /// 通过IFeature.Delete方法删除要素 /// </summary> ...
- 流媒体技术 rtp/rtcp/rtsp资料精华!
流媒体技术 rtp/rtcp/rtsp资料精华! 流媒体技术 流媒体是指在网络中使用流式(Sreaming)传输技术进行传输的连续时基媒体.如音频数据流或视频数据流,而不是一种新的媒体.流媒体技 ...
- 从头认识Spring-2.4 基于java的标准注解装配-@Inject(2)-通过set方法或者其它方法注入
这一章节我们来讨论一下基于java的标准注解装配标签@Inject是如何通过通过set方法或者其它方法注入? 在使用@Inject标签之前.我们须要在pom文件中面增加以下的代码: <depen ...
- jquery源码12 offset() : 位置和尺寸的方法
// Back Compat <1.8 extension point jQuery.fx.step = {}; if ( jQuery.expr && jQuery.expr. ...
- shape-自绘制简单图形
shape 可以绘制简单的图形,颜色等.它主要就是应用于selector 的一些状态. 本文内容参考自http://www.cnblogs.com/cyanfei/archive/2012/07/27 ...
- 带你底层看Sqoop如何转换成MapReduce作业运行的(代码程序)
补充 其实啊,我们知道,sqoop在运行的时候,最终会去转换成mapreduce作业,这个很简单,不多赘述.直接贴出来. 具体这些怎么运行的,见我如下这篇博客.这里只做一个引子. Sqoop Impo ...
- 企业实战之部署Solarwinds Network八部众
企业实战之部署Solarwinds Network 网管系统八部众 Orion Network Performance Monitor是全面的带宽性能监控和故障管理软件,能监控并收集来自路由器.交换机 ...
- Vectorized implementation
Vectorization Vectorization refers to a powerful way to speed up your algorithms. Numerical computin ...