Flask框架项目实例:**租房网站(二)

  • Flask是一款MVC框架,主要是从模型、视图、模板三个方面对Flask框架有一个全面的认识,
  • 通过完成作者-读书功能,先来熟悉Flask框架的完整使用步骤。

  • 操作步骤为:
    • 1.创建项目
    • 2.配置数据库
    • 3.定义模型类
    • 4.定义视图并配置URL

    • 5.定义模板

  • 前面说了创建项目的流程,今天主要从配置到用户,主要根据思维导图来说,先看思维导图


主要有以下几个方面:
1.房屋
  • 新建house_views.py,创建蓝图并注册
  • 需要完成的功能如下:
    • myhouse.html:我的房源
    • newhouse.html:发布新房源
    • index.html:首页
    • search.html:搜索结果页
    • detail.html:房屋详细页

2.订单
  • 新建booking_views.py,创建蓝图并注册
  • 订单模块主要包括的功能如下
    • booking.html:预订页面
    • orders.html:我的订单,作为房客的订单
    • lorders.html:客户订单,作为房东的订单

主要根据思维导图,代码加注释的方法来说明:

1.房屋
  • 新建house_views.py
#coding=utf-8
from flask import Blueprint, jsonify
from flask import request
from flask import sessionfrom qiniu_sdk import put_qiniu
from status_code import REThouse_blueprint=Blueprint('house',__name__)from flask import current_app
from flask import jsonfrom models import Area, Facility, HouseImage, House, User, Order#获取地区信息,并进行缓存
def get_areas():area_dict_list=current_app.redis.get('area_list')if not area_dict_list:area_list=Area.query.all()arear_dict_list=[area.to_dict() for area in area_list]current_app.redis.set('area_list',json.dumps(area_dict_list))else:#存储到redis后会被转换成字符串,所以取出来后需要转换area_dict_list=json.loads(area_dict_list)return area_dict_list#获取设施信息并缓存
def get_facilities():facility_dict_list=current_app.redis.get('facility_list')if not facility_dict_list:facility_list=Facility.query.all()facility_dict_list=[facility.to_dict() for facility in facility_list]current_app.redis.set('facility_list',json.dumps(facility_dict_list))else:facility_dict_list=json.loads(facility_dict_list)return facility_dict_list@house_blueprint.route('/area_facility',methods=['GET'])
def newhouse():#查询地址kkkkarea_dict_list=get_areas()#查询设施facility_dict_list=get_facilities()#构造结果并返回return jsonify(area=area_dict_list,faciclity=facility_dict_list)#保存房屋图片
@house_blueprint.route('/newhouse_image')
def newhouse_image():#接受房屋编号house_id=request.form.get('house_id')#接受图片信息f1=request.files.get('house_image')#保存到七牛云上url=put_qiniu(f1)#保存图片对象image=HouseImage()image.house_id=house_idimage.url=urlimage.add_update()#房屋的默认图片house=House.query.get(house_id)if not house.index_image_url:house.index_image_url=urlhouse.add_update()#返回图片信息return jsonify(code=RET.OK,url=current_app.config.get("QINIU_URL")+url)#保存信息
@house_blueprint.route('/',methods=['POST'])
def newhouse_save():#接收数据params=request.form.to_dict()facility_ids=request.form.getlist('facility')#创建对象并保存house = House()house.user_id = session['user_id']house.area_id = params.get('area_id')house.title = params.get('title')house.price = params.get('price')house.address = params.get('address')house.room_count = params.get('room_count')house.acreage = params.get('acreage')house.beds = params.get('beds')house.unit = params.get('unit')house.capacity = params.get('capacity')house.deposit = params.get('deposit')house.min_days = params.get('min_days')house.max_days = params.get('max_days')#根据设施的编号查询设施对象if facility_ids:facility_list=Facility.query.filter(Facility.id.iin_(facility_ids)).all()house.facilities=facility_listhouse.add_update()#返回结果return jsonify(code=RET.OK,house_id=house.id)#我的房屋
@house_blueprint.route('/',methods=['GET'])
def myhouse():user_id=session['user_id']user=User.query.get(user_id)if user.id_name:#已经完成实名认证,查询当前用户的房屋信息house_list=House.query.filter(House.user_id==user_id).order_by(House.id.desc())house_list2=[]for house in house_list:house_list2.append(house.to_dict())return jsonify(code=RET.OK,hlist=house_list2)else:#没有完成实名认证return jsonify(code=RET.USERERR)#查询房屋与设施,如果是自己的则查询不出来,目的就是不让自己预定自己的房子
@house_blueprint.route('/<init:id>',methods=['GET'])
def house_detail(id):#查询房屋信息house=House.query.get(id)#查询设施信息facility_list=get_facilities()#判断当前房屋是不是自己booking=1if 'user_id' in session:if house.user_id==session['user_id']:booking=0return jsonify(house=house.to_full_dict(),facility_list=facility_list,booking=booking)#搜索房屋
@house_blueprint.route('/search',methods=['GET'])
def search():#接收参数dict=request.argsarea_id=int(dict.get('aid'))begin_date=dict.get('sd')end_date=dict.get('ed')sort_key=dict.get('sk')#满足地区条件hlist=House.query.filter(House.area_id==area_id)#不能查询自己发布的房源,排除当前用户发布的房屋if 'user_id' in session:hlist=hlist.filter(House.user_id!=(session['user_id']))#满足事件条件,当订单完成后再完成时间限制order_list=Order.query.filter(Order.status!='REJECTED')#情况一:# order_list1=Order.query.filter(Order.begin_date>=begin_date,Order.end_date<=end_date)#情况二order_list2=Order.query.filter(Order.begin_date<begin_date,Order.end_date>end_date)#情况三order_list3=Order.query.filter(Order.end_date>=begin_date,Order.end_date<=end_date)#情况四:order_list4=Order.query.filter(Order.begin_date>=begin_date,Order.begin_date<=end_date)#获取订单中的房屋编号house_ids=[order.house_id for order in order_list2]for order in order_list3:house_ids.append(order.house_id)for order in order_list4:if order.house_id not in house_ids:house_ids.append(order.house_id)hlist=hlist.filter(House.id.notin_(house_ids))#排序规则,默认根据最新排列sort=House.id.desc()if sort_key=='booking':sort=House.order_count.desc()elif sort_key=='price-inc':sort=House.price.asc()elif sort_key=='price-des':sort=House.price.desc()hlist=hlist.order_by(sort)hlist2=[]for house in hlist:hlist2.append(house.to_dict())#获取地区信息if request.args.get('area','0')=='1':alist=get_areas()else:alist=[]return jsonify(hlist=hlist2,alist=alist)

订单

  • 新建booking_views.py
# coding=utf-8
from flask import Blueprint,jsonify,request,session
order_blueprint=Blueprint('order',__name__)
from datetime import datetime
from models import House,Order
from status_code import RET,ret_map
from my_decorators import is_login
import logging#查询指定编号的房屋信息
@order_blueprint.route('/house/<int:id>')
def booking_house(id):house=House.query.get(id)return jsonify(house=house.to_dict())#创建订单
@is_login
@order_blueprint.route('/',methods=['POST'])
def booking():#接收参数dict=request.formhouse_id=int(dict.get('house_id'))start_date=datetime.strptime(dict.get('start_date'),'%Y-%m-%d')end_date=datetime.strptime(dict.get('end_date'),'%Y-%m-%d')#验证有效性if not all([house_id,start_date,end_date]):return jsonify(code=RET.PARAMERR,msg=ret_map[RET.PARAMERR])if start_date>end_date:return jsonify(code=RET.PARAMERR,msg=ret_map[RET.PARAMERR])#查询房屋对象try:house=House.query.get(house_id)except:logging.error(u'下订单-查询房屋出错,房屋编号%d'%house_id)return jsonify(code=RET.DBERR,msg=ret_map[RET.DBERR])#创建订单对象order=Order()order.user_id=session['user_id']order.house_id=house_idorder.begin_date=start_dateorder.end_date=end_dateorder.days=(end_date-start_date).days+1order.house_price=house.priceorder.amount=order.days*order.house_pricetry:order.add_update()except:logging.error(u'下订单-出错')return jsonify(code=RET.DBERR,msg=ret_map[RET.DBERR])#返回信息return jsonify(code=RET.OK)#作为租客查询订单
@is_login#
@order_blueprint.route('/',methods=['GET'])
def orders():uid=session['user_id']order_list=Order.query.filter(Order.user_id==uid).order_by(Order.id.desc())order_list2=[order.to_dict() for order in order_list]return jsonify(olist=order_list2)#作为房东查询订单
@is_login
@order_blueprint.route('/fd',methods=['GET'])
def lorders():uid=session['user_id']#查询当前用户的所有房屋编号hlist=House.query.filter(House.user_id==uid)hid_list=[house.id for house in hlist]#根据房屋编号查找订单order_list=Order.query.filter(Order.house_id.in_(hid_list)).order_by(Order.id.desc())#构造结果olist=[order.to_dict() for order in order_list]return jsonify(olist=olist)#修改状态
@order_blueprint.route('/<int:id>',methods=['PUT'])
def status(id):#接收参数:状态status=request.form.get('status')#查找订单对象order=Order.query.get(id)#修改order.status=status#保存order.add_update()return jsonify(code=RET.OK)


完整代码:https://gitee.com/itpython/ihome/tree/bj14/ihome


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473569.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android中的APK,TASK,PROCESS,USERID之间的关系

开发Android已经有一段时间了&#xff0c;今天接触到底层的东西&#xff0c;所以对于进程&#xff0c;用户的id以及Android中的Task,Apk之间的关系&#xff0c;要做一个研究&#xff0c;下面就是研究结果: apk一般占一个dalvik,一个进程,一个task。当然通过通过设置也可以多个进…

天池 在线编程 插入五

文章目录1. 题目2. 解题1. 题目 描述 给定一个数字&#xff0c;在数字的任意位置插入一个5&#xff0c;使得插入后的这个数字最大 示例 样例 1: 输入: a 234 输出: 5234 来源&#xff1a;https://tianchi.aliyun.com/oj/141758389886413149/160295184768372892 2. 解…

Flink的Window

1 Window概述 streaming流式计算是一种被设计用于处理无限数据集的数据处理引擎&#xff0c;而无限数据集是指一种不断增长的本质上无限的数据集&#xff0c;而window是一种切割无限数据为有限块进行处理的手段。 Window是无限数据流处理的核心&#xff0c;Window将一个无限的s…

标记语言Markdown介绍以及日常使用

Markdown介绍 Markdown是一种文本标记语言&#xff0c;用于快速文档排版Markdown文件为纯文本文件&#xff0c;后缀名为 .mdMarkdown介于Word和HTML之间 比起Word&#xff0c;Markdown是纯文本&#xff0c;排版文档轻量、方便、快速。比起HTML&#xff0c;Markdown简单直观&…

天池 在线编程 有效的字符串

文章目录1. 题目2. 解题1. 题目 描述 如果字符串的所有字符出现的次数相同&#xff0c;则认为该字符串是有效的。 如果我们可以在字符串的某1个索引处删除1个字符&#xff0c;并且其余字符出现的次数相同&#xff0c;那么它也是有效的。 给定一个字符串s&#xff0c;判断它是否…

Flink的时间语义和Watermark

1 时间语义 数据迟到的概念是&#xff1a;数据先产生&#xff0c;但是处理的时候滞后了 在Flink的流式处理中&#xff0c;会涉及到时间的不同概念&#xff0c;如下图所示&#xff1a; Event Time&#xff1a;是事件创建的时间。它通常由事件中的时间戳描述&#xff0c;例如采集…

数据分析案例:亚洲国家人口数据计算

数据截图: 数据下载地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1dGHwAC5 密码&#xff1a;nfd2 该数据包含了2006年-2015年10年间亚洲地区人口数量数据&#xff0c;共10行50列数据。我们需要使用Numpy完成如下数据任务: 计算2015年各个国家人口数据计算朝鲜历…

LeetCode 1646. 获取生成数组中的最大值

文章目录1. 题目2. 解题1. 题目 给你一个整数 n 。按下述规则生成一个长度为 n 1 的数组 nums &#xff1a; nums[0] 0nums[1] 1当 2 < 2 * i < n 时&#xff0c;nums[2 * i] nums[i]当 2 < 2 * i 1 < n 时&#xff0c;nums[2 * i 1] nums[i] nums[i 1]…

TotoiseSVN的基本使用方法

一、签入源代码到SVN服务器 假如我们使用Visual Studio在文件夹StartKit中创建了一个项目&#xff0c;我们要把这个项目的源代码签入到SVN Server上的代码库中里&#xff0c;首先右键点击StartKit文件夹&#xff0c;这时候的右键菜单如下图所示&#xff1a; 图2-2-1 点击Import…

LeetCode 1647. 字符频次唯一的最小删除次数(贪心)

文章目录1. 题目2. 解题1. 题目 如果字符串 s 中 不存在 两个不同字符 频次 相同的情况&#xff0c;就称 s 是 优质字符串 。 给你一个字符串 s&#xff0c;返回使 s 成为 优质字符串 需要删除的 最小 字符数。 字符串中字符的 频次 是该字符在字符串中的出现次数。 例如&am…

Flink中的状态管理

1 Flink中的状态 当数据流中的许多操作只查看一个每次事件(如事件解析器)&#xff0c;一些操作会跨多个事件的信息(如窗口操作)。这些操作称为有状态。状态由一个任务维护&#xff0c;并且用来计算某个结果的所有数据&#xff0c;都属于这个任务的状态。可以简单的任务状态就是…

Python之日志处理(logging模块)

主要内容 日志相关概念logging模块简介使用logging提供的模块级别的函数记录日志logging模块日志流处理流程使用logging四大组件记录日志配置logging的几种方式向日志输出中添加上下文信息参考文档 一、日志相关概念 日志是一种可以追踪某些软件运行时所发生事件的方法。软件开…

LeetCode 514. 自由之路(记忆化递归 / DP)

文章目录1. 题目2. 解题1. 题目 电子游戏“辐射4”中&#xff0c;任务“通向自由”要求玩家到达名为“Freedom Trail Ring”的金属表盘&#xff0c;并使用表盘拼写特定关键词才能开门。 给定一个字符串 ring&#xff0c;表示刻在外环上的编码&#xff1b;给定另一个字符串 ke…

Flink中的容错机制

1 checkpoint Flink 故障恢复机制的核心&#xff0c;就是应用状态的一致性检查点checkpoint。 在Spark Streaming中仅仅是针对driver的故障恢复做了数据和元数据的Checkpoint&#xff0c;处理的是当前时间点所有分区当前数据的状态。在Flink中不能把当前所有分区的数据直接存下…

LeetCode 698. 划分为k个相等的子集(回溯)

文章目录1. 题目2. 解题1. 题目 给定一个整数数组 nums 和一个正整数 k&#xff0c;找出是否有可能把这个数组分成 k 个非空子集&#xff0c;其总和都相等。 示例 1&#xff1a; 输入&#xff1a; nums [4, 3, 2, 3, 5, 2, 1], k 4 输出&#xff1a; True 说明&#xff1a;…

MySQL中的表中增加删除字段

1增加两个字段&#xff1a; mysql> create table id_name(id int,name varchar(20)); Query OK, 0 rows affected (0.13 sec)mysql> alter table id_name add age int,add address varchar(11); Query OK, 0 rows affected (0.13 sec) Records: 0 Duplicates: 0 Warnin…

Ubuntu下svn 版本管理客户端工具及常用方法

Ubuntu16.04系统下安装RapidSVN版本控制器及配置diff,editor,merge和exploer工具&#xff0c;在Window下我们使用TortoiseSVN(小乌龟)&#xff0c;可以很方便地进行查看、比较、更新、提交、回滚等SVN版本控制操作。 在Linux下我们可以使用RapidSVN。RapidSVN是一款轻量级的免费…

Flink的Table API 与SQL的流处理

1 流处理与SQL的区别 Table API和SQL&#xff0c;本质上还是基于关系型表的操作方式&#xff1b;而关系型表、SQL本身&#xff0c;一般是有界的&#xff0c;更适合批处理的场景。所以在流处理的过程中&#xff0c;有一些特殊概念。 SQL流处理处理对象字段元组的有界集合字段元…

LeetCode 833. 字符串中的查找与替换(排序,replace)

文章目录1. 题目2. 解题1. 题目 某个字符串 S 需要执行一些替换操作&#xff0c;用新的字母组替换原有的字母组&#xff08;不一定大小相同&#xff09;。 每个替换操作具有 3 个参数&#xff1a;起始索引 i&#xff0c;源字 x 和目标字 y。 规则是&#xff1a;如果 x 从原始…

Json.NET

我前面的一篇博客 Metro应用Json数据处理 介绍了如何使用 DataContractJsonSerializer 类将对象的实例序列化为JSON字符串以及将JSON字符串反序列化为对象的实例的处理方式。而此种处理方式的一个很大的缺点就是要求JSON字符串格式是约定好的&#xff0c;而在很多情况下我们无法…