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 ...
随机推荐
- jQuery 判断是否包含在数组中 jQuery.inArray()
var arr = [ "mysql", "php", "css", "js" ]; $.inArray(" ...
- HttpClient方式调用接口的java 简单案例源码+附jar包
1 package com.itNoob.httpClient; import org.apache.commons.httpclient.HttpClient; import org.apache. ...
- OR1200处理器中Wishbone总线接口模块WB_BIU介绍
下面内容摘自<步步惊芯--软核处理器内部设计分析>一书 WB_BIU模块是OR1200处理器与外部Wishbone总线连接的接口模块.15.1节给出了WB_BIU模块的对外连接关系,并指出 ...
- 【原生JS组件】javascript 运动框架
大家都知道JQuerry有animate方法来给DOM元素进行运动,CSS3中也有transition.transform来进行运动.而使用原生的Javascript来控制元素运动,须要写非常多运动的 ...
- Boolean operations between triangle meshes
Boolean operations between triangle meshes eryar@163.com Abstract. Boolean operations is one of basi ...
- 目标决定人生——没有目标就失去一切 (没有目标的奋斗是浪费青春,比如交了钱却不去参加考试、让时间白白溜走。根据目标与定位来选择最合适的企业。人生要算总账)good
没有目标就失去一切 刚毕业那会儿,幼稚得可笑,老跟同学打电话,明面上聊聊近况,暗地里比较.你要比我工资多一百块,心里特不平衡,凭什么呀,在学校那会儿公认的我比你强.你要带个头衔,而我啥也不是,普通员工 ...
- C#中结构struct的使用
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Kinect 开发 —— Kinect Interaction 交互控件
Kinect Interactions 提供了一些新的带有姿势识别的控件如 push-to-press 按钮, grip-to-pan 列表控件, 而且支持多用户,同时二个人进行的交互,这些新添加的控 ...
- Mysql学习总结(18)——Mysql主从架构的复制原理及配置详解
一.复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重 ...
- Android模拟、实现、触发系统按键事件的方法
Android模拟.实现.触发系统按键事件的方法 /** * 模拟系统按键. * * @param keyCode */ public static void onKeyEvent(final ...