说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家!

接着上一篇博客继续往下写 :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,所以将导入代码,放到此处即可
  1. # 注册蓝图
  2. from ihome import api_1_0
  3. 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库
  1. import logging
  • step2 并配置日志信息以及设置日志等级

  • step3 配置后日志信息后,需要在api_1_0/demo视图函数中进行记录日志,有两种方法,第一种是直接在demo文件中使用logging标准库模块,第二种是使用flask 框架中的全局上下文current_app对象,为什么能使用current_app对象,因为这个对象把logging模块中的logger塞到了这个对象中了

成功在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即可
  1. from ihome import db, models
  • step3 再次执行迁移 ,则显示迁移成功

  • step4 执行升级,将数据写入到mysql中的ihome_python数据库中

  • step5 以上步骤完成后,进入mysql,使用ihome_python数据库,查询数据库表成功生成

Flask项目之手机端租房网站的实战开发(三)的更多相关文章

  1. Flask项目之手机端租房网站的实战开发(一)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 一丶项目介绍 产品:关于手机移动端的租房网站 角色:在这个产品中用户包括房东与房客 功能:房东可以在这个平台发布自己的房屋,房客可 ...

  2. Flask项目之手机端租房网站的实战开发(二)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...

  3. Flask项目之手机端租房网站的实战开发(十四)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...

  4. Flask项目之手机端租房网站的实战开发(六)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...

  5. Flask项目之手机端租房网站的实战开发(十一)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...

  6. Flask项目之手机端租房网站的实战开发(十)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...

  7. Flask项目之手机端租房网站的实战开发(九)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...

  8. Flask项目之手机端租房网站的实战开发(八)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...

  9. Flask项目之手机端租房网站的实战开发(四)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...

随机推荐

  1. Coderfroces 862 B . Mahmoud and Ehab and the bipartiteness

     Mahmoud and Ehab and the bipartiteness Mahmoud and Ehab continue their adventures! As everybody in ...

  2. POJ 1610 Count the Colors

    Count the Colors Time Limit: 2 Seconds      Memory Limit: 65536 KB Painting some colored segments on ...

  3. Unity容器实现自动注册

    如何创建Unity容器? 首先NuGet搜索Unity, 该示例中使用的版本为4.0.1 新建控制台程序 示例中使用常规操作, 创建一个IPay接口, 分别有两个实现类: ApplePay.Huawe ...

  4. 【Mysql】经常使用指令之——忘记password

    上一篇文章基本总结了下myql下通过指令怎么创建用户.详见:[Mysql]经常使用指令之--用户操作(创建,授权,改动.删除) 今天说下特殊情况,忘记password了怎么办??? 重装.删除配置等能 ...

  5. Alcatraz:管理Xcode插件

    简单介绍 Alcatraz是一个帮你管理Xcode插件.模版以及颜色配置的工具. 它能够直接集成到Xcode的图形界面中,让你感觉就像在使用Xcode自带的功能一样. 安装和删除 使用例如以下的命令行 ...

  6. jquery2.0.3 全部源码

    /*! * Includes Sizzle.js 选择器,独立的库 * http://sizzlejs.com/ */ (function( window, undefined ) { //" ...

  7. 「HAOI2016」字符合并

    「HAOI2016」字符合并 题意: ​ 有一个长度为\(n\)的\(01\)串,你可以每次将相邻的\(k\)个字符合并,得到一个新的字符并获得一定分数.得到的新字符和分数由这\(k\)个字符确定.你 ...

  8. PatentTips - Transparent unification of virtual machines

    BACKGROUND Virtualization technology enables a single host computer running a virtual machine monito ...

  9. 洛谷——P2678 跳石头

    https://www.luogu.org/problem/show?pid=2678#sub 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着 ...

  10. NYOJ 927 The partial sum problem 【DFS】+【剪枝】

    The partial sum problem 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描写叙述 One day,Tom's girlfriend give him a ...