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

接着上一篇博客继续往下写 :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塞到了这个对象中了

成功在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项目之手机端租房网站的实战开发(三)的更多相关文章

  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. sql 通过某段时间求得改段时间内的工作时长,排除工作日

    CREATE FUNCTION Fun_GetTotalHourBySomeTime(@TaskId NVARCHAR(30),@Bu_trupstartDate NVARCHAR(50),@Bu_t ...

  2. 《一》安装 TP5

    tp5 官方参考手册:http://www.kancloud.cn/manual/thinkphp5/118008 我这里采用的是 composer 安装,如果您没有安装 composer 的话 tp ...

  3. WebAssembly学习(五):AssemblyScript - Hello World

    一.项目创建 1.创建AssemblyScript根目录 mkdir AssemblyScript 2.安装AssemblyScript开发依赖 cnpm install --save-dev Ass ...

  4. Maven学习总结(20)——Maven pom.xml配置再体会

    Maven的pom.xml配置文件详解 <!--父项目的坐标.如果项目中没有规定某个元素的值,那么父项目中的对应值即为项目的默认值. 坐标包括group ID,artifact ID和 vers ...

  5. Vijos——T1053 Easy sssp

    https://vijos.org/p/1053 描述 输入数据给出一个有N(2 <= N <= 1,000)个节点,M(M <= 100,000)条边的带权有向图. 要求你写一个程 ...

  6. PAT-中国大学MOOC-陈越、何钦铭-数据结构基础习题集 00-自測4. Have Fun with Numbers (20) 【二星级】

    题目链接:http://www.patest.cn/contests/mooc-ds/00-%E8%87%AA%E6%B5%8B4 题面: 00-自測4. Have Fun with Numbers ...

  7. jquery13 attr() prop() val() addClass()等 : 对元素属性的操作

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  8. Android照片墙完整版,完美结合 内存方案 LruCache 和 硬盘方案 DiskLruCache

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/34093441 在上一篇文章当中,我们学习了DiskLruCache的概念和基本用法 ...

  9. Docs-->.NET-->API reference-->System.​Web.​UI.​Web​Controls-->Repeater

    https://docs.microsoft.com/en-us/dotnet/api/system.web.ui.webcontrols.repeater?view=netframework-4.7 ...

  10. jupyter sparkmagic on hdp

    1.安装jupyter 2.安装sparkmagic 3.设置超时 "livy_server_heartbeat_timeout_seconds": 0, 4.设置集群模式 &qu ...