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 session

from qiniu_sdk import put_qiniu
from status_code import RET

house_blueprint=Blueprint('house',__name__)

from flask import current_app
from flask import json

from 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():
    #查询地址kkkk
    area_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_id
    image.url=url
    image.add_update()
    #房屋的默认图片
    house=House.query.get(house_id)
    if not house.index_image_url:
        house.index_image_url=url
        house.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_list
    house.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=1
    if 'user_id' in session:
        if house.user_id==session['user_id']:
            booking=0

    return jsonify(house=house.to_full_dict(),facility_list=facility_list,booking=booking)

#搜索房屋
@house_blueprint.route('/search',methods=['GET'])
def search():
    #接收参数
    dict=request.args
    area_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.form
    house_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_id
    order.begin_date=start_date
    order.end_date=end_date
    order.days=(end_date-start_date).days+1
    order.house_price=house.price
    order.amount=order.days*order.house_price

    try:
        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


  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值