ui设计定义,浙江网站建设网站优化,小米网站的建设目的,建筑工程自我鉴定300字Flask是一款MVC框架#xff0c;主要是从模型、视图、模板三个方面对Flask框架有一个全面的认识#xff0c;通过完成作者-读书功能#xff0c;先来熟悉Flask框架的完整使用步骤。 操作步骤为#xff1a; 1.创建项目2.配置数据库3.定义模型类4.定义视图并配置URL 5.定义模板… Flask是一款MVC框架主要是从模型、视图、模板三个方面对Flask框架有一个全面的认识通过完成作者-读书功能先来熟悉Flask框架的完整使用步骤。 操作步骤为 1.创建项目2.配置数据库3.定义模型类4.定义视图并配置URL 5.定义模板 前面说了创建项目的流程今天主要从配置到用户主要根据思维导图来说先看思维导图 主要有以下几个方面1.配置文件设置config.py主文件ihome.py七牛云(图片上传qinniuyun_sdk.py短信发送ytx_send.py管理文件manager.py状态文件status_code.py模型设置models.py2.视图user_views.py主要根据思维导图代码加注释的方法来说明1.配置文件 设置config.py、数据库、七牛云配置 # codingutf-8
import hashlibimport redis
class Config:DEBUGFalseSQLALCHEMY_DATABASE_URImysql://root:mysql127.0.0.1:3306/ihome_bj14SQLALCHEMY_TRACK_MODIFICATIONS True
#PIL pillow#redis配置REDIS_HOST 127.0.0.1REDIS_PORT 6379#session配置SECRET_KEY iHome#将session存储到redis中SESSION_TYPE redisSESSION_USE_SIGNER TrueSESSION_REDIS redis.StrictRedis(hostREDIS_HOST, portREDIS_PORT)PERMANENT_SESSION_LIFETIME 60*60*24*14#秒# 七牛云的访问服务器QINIU_URL http://ozyr1iz9u.bkt.clouddn.com/# # 权限信息# TOKEN hashlib.md5(ihome_bj14).hexdigest()class DevelopConfig(Config):DEBUG True
class ProductConfig(Config):pass主文件ihome.py #codingutf-8#1.创建app对象
from manager import create_app
from config import DevelopConfig
appcreate_app(DevelopConfig)#2.初始化数据库
from models import db
db.init_app(app)#3.创建管理对象
from flask_script import Manager
managerManager(app)#4.添加迁移命令
from flask_migrate import Migrate,MigrateCommand
Migrate(app,db)
manager.add_command(db,MigrateCommand)#5.注册蓝图
from html_views import html_blueprint
app.register_blueprint(html_blueprint)from api_v1.user_views import user_blueprint
app.register_blueprint(user_blueprint,url_prefix/api/v1/user)from api_v1.house_views import house_blueprint
app.register_blueprint(house_blueprint,url_prefix/api/v1/house)from api_v1.order_views import order_blueprint
app.register_blueprint(order_blueprint,url_predix/api/v1/order)# # 钩子是否包含token
# from flask import request,jsonify,current_app
# from status_code import *
# app.before_request
# def check_token():
# if request.path.startswith(/api):
# if token not in request.args or request.args.get(token)!current_app.config[TOKEN]:
# return jsonify(codeRET.REQERR)if __name__ __main__:manager.run() 七牛云(图片上传qinniuyun_sdk.py #codingutf-8from qiniu import Auth,put_data
import logging
from flask import jsonify
from status_code import RETdef put_qiniu(f1):access_key 6vvGPJ08BsHRjN7RRGVU3sEd38502x1TS0_i0x7ssecret_key wzgWlHpflABi9DGn9TIb8IBRwqsZTwNJ--KZhosy# 空间名称bucket_name itpythontry:#构建鉴权对象q Auth(access_key,secret_key)#生成上传Tokentoken q.upload_token(bucket_name)#上传文件数据ret是字典键是hash/key,值是新文件名info是response对象ret,info put_data(token,None,f1.read())return ret.get(key)except:logging.ERROR(u访问七牛云出错)return jsonify(codeRET.SERVERERR) 短信发送ytx_send.py # codingutf-8
from CCPRestSDK import REST
# import ConfigParser# 主帐号
accountSid 8a216da85fe1c856015fe83104160cc;# 主帐号Token
accountToken 5a1dc45a953a41cebb82b5654662568;# 应用Id
appId 8a216da85fe1c856015fe8310471033;# 请求地址格式如下不需要写http://
serverIP app.cloopen.com;# 请求端口
serverPort 8883;# REST版本号
softVersion 2013-12-26;# 发送模板短信
# param to 手机号码
# param datas 内容数据 格式为数组 例如{12,34}如不需替换请填
# param $tempId 模板Idto: 短信接收手机号码集合,用英文逗号分开,如 13810001000,13810011001,最多一次发送200个。
datas内容数据需定义成数组方式如模板中有两个参数定义方式为array[Marry,Alon]。
templateId: 模板Id,如使用测试模板模板id为1如使用自己创建的模板则使用自己创建的短信模板id即可。def sendTemplateSMS(to, datas, tempId):# 初始化REST SDKrest REST(serverIP, serverPort, softVersion)rest.setAccount(accountSid, accountToken)rest.setAppId(appId)result rest.sendTemplateSMS(to, datas, tempId)return result.get(statusCode)管理文件manager.py # codingutf-8
from flask import Flask
from redis import StrictRedis
from werkzeug.routing import BaseConverter
import os
from flask_session import SessionBASE_DIRos.path.dirname(os.path.abspath(__file__))class HTMLConverter(BaseConverter):regex .*def create_app(config):appFlask(__name__)app.config.from_object(config)app.url_map.converters[html]HTMLConverter#session初始化将session存储到redis中Session(app)# 创建redis存储对象redis_store StrictRedis(hostconfig.REDIS_HOST, portconfig.REDIS_PORT)app.redis redis_store# 日志处理import loggingfrom logging.handlers import RotatingFileHandlerlogging.basicConfig(levellogging.DEBUG)file_log_handler RotatingFileHandler(os.path.join(BASE_DIR, logs/ihome.log), maxBytes1024 * 1024 * 100,backupCount10)formatter logging.Formatter(%(levelname)s %(filename)s:%(lineno)d %(message)s)file_log_handler.setFormatter(formatter)logging.getLogger().addHandler(file_log_handler)return app 状态文件status_code.py # codingutf-8
class RET:OK 0DBERR 4001NODATA 4002DATAEXIST 4003DATAERR 4004SESSIONERR 4101LOGINERR 4102PARAMERR 4103USERERR 4104ROLEERR 4105PWDERR 4106REQERR 4201IPERR 4202THIRDERR 4301IOERR 4302SERVERERR 4500UNKOWNERR 4501ret_map {RET.OK: u成功,RET.DBERR: u数据库查询错误,RET.NODATA: u无数据,RET.DATAEXIST: u数据已存在,RET.DATAERR: u数据错误,RET.SESSIONERR: u用户未登录,RET.LOGINERR: u用户登录失败,RET.PARAMERR: u参数错误,RET.USERERR: u用户不存在或未激活,RET.ROLEERR: u用户身份错误,RET.PWDERR: u密码错误,RET.REQERR: u非法请求或请求次数受限,RET.IPERR: uIP受限,RET.THIRDERR: u第三方系统错误,RET.IOERR: u文件读写错误,RET.SERVERERR: u内部错误,RET.UNKOWNERR: u未知错误,
}模型设置models.py主要根据网页来寻找设置对象 # codingutf-8
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
from werkzeug.security import generate_password_hash,check_password_hash
from flask import current_appdbSQLAlchemy()class BaseModel(object):create_timedb.Column(db.DATETIME,defaultdatetime.now())update_timedb.Column(db.DATETIME,defaultdatetime.now(),onupdatedatetime.now())def add_update(self):db.session.add(self)db.session.commit()def delete(self):db.session.delete(self)db.session.commit()class User(BaseModel,db.Model):__tablename__ihome_useriddb.Column(db.INTEGER,primary_keyTrue)phonedb.Column(db.String(11),uniqueTrue)pwd_hashdb.Column(db.String(200))namedb.Column(db.String(30),uniqueTrue)avatardb.Column(db.String(100))id_namedb.Column(db.String(30))id_carddb.Column(db.String(18),uniqueTrue)housesdb.relationship(House,backrefuser)ordersdb.relationship(Order,backrefuser)#读propertydef password(self):return #写password.setterdef password(self,pwd):self.pwd_hashgenerate_password_hash(pwd)#对比def check_pwd(self,pwd):return check_password_hash(self.pwd_hash,pwd)def to_basic_dict(self):return {id:self.id,avatar:current_app.config[QINIU_URL]self.avatar if self.avatar else ,name:self.name,phone:self.phone}def to_auth_dict(self):return {id_name:self.id_name,id_card:self.id_card}ihome_house_facility db.Table(ihome_house_facility,db.Column(house_id, db.Integer, db.ForeignKey(ihome_house.id), primary_keyTrue), # 房屋编号db.Column(facility_id, db.Integer, db.ForeignKey(ihome_facility.id), primary_keyTrue) # 设施编号
)class House(BaseModel, db.Model):房屋信息__tablename__ ihome_houseid db.Column(db.Integer, primary_keyTrue) # 房屋编号# 房屋主人的用户编号user_id db.Column(db.Integer, db.ForeignKey(ihome_user.id), nullableFalse)# 归属地的区域编号area_id db.Column(db.Integer, db.ForeignKey(ihome_area.id), nullableFalse)title db.Column(db.String(64), nullableFalse) # 标题price db.Column(db.Integer, default0) # 单价单位分address db.Column(db.String(512), default) # 地址room_count db.Column(db.Integer, default1) # 房间数目acreage db.Column(db.Integer, default0) # 房屋面积unit db.Column(db.String(32), default) # 房屋单元 如几室几厅capacity db.Column(db.Integer, default1) # 房屋容纳的人数beds db.Column(db.String(64), default) # 房屋床铺的配置deposit db.Column(db.Integer, default0) # 房屋押金min_days db.Column(db.Integer, default1) # 最少入住天数max_days db.Column(db.Integer, default0) # 最多入住天数0表示不限制order_count db.Column(db.Integer, default0) # 预订完成的该房屋的订单数index_image_url db.Column(db.String(256), default) # 房屋主图片的路径# 房屋的设施facilities db.relationship(Facility, secondaryihome_house_facility)images db.relationship(HouseImage) # 房屋的图片ordersdb.relationship(Order,backrefhouse)def to_dict(self):return {id:self.id,title:self.title,image:current_app.config[QINIU_URL]self.index_image_url if self.index_image_url else ,area:self.area.name,price:self.price,create_time:self.create_time.strftime(%Y-%m-%d %H:%M:%S),avatar:current_app.config[QINIU_URL]self.user.avatar if self.user.avatar else ,room:self.room_count,order_count:self.order_count,address:self.address}def to_full_dict(self):return {id:self.id,user_avatar:current_app.config[QINIU_URL]self.user.avatar if self.user.avatar else ,user_name:self.user.name,price:self.price,address:self.area.nameself.address,room_count:self.room_count,acreage:self.acreage,unit:self.unit,capacity:self.capacity,beds:self.beds,deposit:self.deposit,min_days:self.min_days,max_days:self.max_days,order_count:self.order_count,images:[current_app.config[QINIU_URL]image.url for image in self.images],facilities:[facility.to_dict() for facility in self.facilities],}class HouseImage(BaseModel, db.Model):房屋图片__tablename__ ihome_house_imageid db.Column(db.Integer, primary_keyTrue)# 房屋编号house_id db.Column(db.Integer, db.ForeignKey(ihome_house.id), nullableFalse)url db.Column(db.String(256), nullableFalse) # 图片的路径class Facility(BaseModel, db.Model):设施信息__tablename__ ihome_facilityid db.Column(db.Integer, primary_keyTrue) # 设施编号name db.Column(db.String(32), nullableFalse) # 设施名字css db.Column(db.String(30), nullableFalse) # 设施展示的图标def to_dict(self):return {id:self.id,name:self.name,css:self.css}def to_house_dict(self):return {id:self.id}class Area(BaseModel, db.Model):城区__tablename__ ihome_areaid db.Column(db.Integer, primary_keyTrue) # 区域编号name db.Column(db.String(32), nullableFalse) # 区域名字houses db.relationship(House, backrefarea) # 区域的房屋def to_dict(self):return {id:self.id,name:self.name}class Order(BaseModel,db.Model):__tablename__ ihome_orderid db.Column(db.Integer, primary_keyTrue)user_id db.Column(db.Integer, db.ForeignKey(ihome_user.id), nullableFalse)house_id db.Column(db.Integer, db.ForeignKey(ihome_house.id), nullableFalse)begin_date db.Column(db.DateTime, nullableFalse)end_date db.Column(db.DateTime, nullableFalse)days db.Column(db.Integer, nullableFalse)house_price db.Column(db.Integer, nullableFalse)amount db.Column(db.Integer, nullableFalse)status db.Column(db.Enum(WAIT_ACCEPT, # 待接单,WAIT_PAYMENT, # 待支付PAID, # 已支付WAIT_COMMENT, # 待评价COMPLETE, # 已完成CANCELED, # 已取消REJECTED # 已拒单),defaultWAIT_ACCEPT, indexTrue)comment db.Column(db.Text)def to_dict(self):return {order_id:self.id,house_title:self.house.title,image:current_app.config[QINIU_URL]self.house.index_image_url if self.house.index_image_url else ,create_date:self.create_time.strftime(%Y-%m-%d),begin_date:self.begin_date.strftime(%Y-%m-%d),end_date:self.end_date.strftime(%Y-%m-%d),amount:self.amount,days:self.days,status:self.status,comment:self.comment}
模型设定好之后执行数据库迁移 2.视图user_views.py #codingutf-8
import random
import reimport logging
from flask import Blueprint, jsonify
from flask import current_app
from flask import make_response
from flask import request
from flask import session
from qiniu_sdk import put_qiniufrom captcha.captcha import captcha
from models import User
from status_code import RET, ret_map
from ytx_sdk.ytx_send import sendTemplateSMS
from my_decorators import is_loginuser_blueprintBlueprint(user,__name__)#验证码
user_blueprint.route(/yzm)
def yzm():name,text,imagecaptcha.generate_captcha()session[image_yzm]textresponsemake_response(image)response.headers[Content-Type]image/jpegreturn response#短信发送设置
user_blueprint.route(/send_sms)
def send_sms():#接收请求的数据dictrequest.argsmobiledict.get(mobile)imageCodedict.get(imageCode)#验证参数是否存在if not all([mobile,imageCode]):return jsonify(codeRET.PARAMERR,msgret_map[RET.PARAMERR])#验证手机号格式是否正确if not re.match(r^1[345789]\d{9}$,mobile):return jsonify(codeRET.PARAMERR,msgu手机号格式不正确)#验证手机号是否存在if User.query.filter_by(phonemobile).count():return jsonify(codeRET.PARAMERR,msgu手机号已存在)#验证图片验证码if imageCode!session[image_yzm]:return jsonify(codeRET.PARAMERR,msgu图片验证码错误)#通过云通讯函数进行短信发送sms_coderandom.randint(1000,9999)session[sms_yzm]sms_codeprint(sms_code)result000000# resultsendTemplateSMS(mobile,[sms_code,5],1)#根据云通讯返回的结果进行相应if result000000:return jsonify(codeRET.OK,msgret_map[RET.OK])else:return jsonify(codeRET.UNKOWNERR,msgu短信发送失败)#用户注册
user_blueprint.route(/,methods[POST])
def user_register():#接收参数dictrequest.formmobiledict.get(mobile)imagecodedict.get(imagecode)phonecodedict.get(phonecode)passworddict.get(password)password2dict.get(password2)#验证参数是否存在if not all([mobile,imagecode,phonecode,password,password2]):return jsonify(codeRET.PARAMERR,msgret_map[RET.PARAMERR])#验证图片验证码if imagecode!session[image_yzm]:return jsonify(codeRET.PARAMERR,msgu图片验证码错误)#验证短信验证码if int(phonecode)!session[sms_yzm]:return jsonify(codeRET.PARAMERR,msgu短信验证码错误)#验证手机号格式是否正确if not re.match(r^1[345789]\d{9}$,mobile):return jsonify(codeRET.PARAMERR,msgu手机格式错误)#验证手机号是否存在if User.query.filter_by(phonemobile).count():return jsonify(codeRET.PARAMERR,msgu手机号码存在)#保存用户对象userUser()user.phonemobileuser.namemobileuser.passwordpasswordtry:user.add_update()return jsonify(codeRET.OK,msgret_map[RET.OK])except:logging.ERROR(u用户注册更新数据库失败手机号%s,密码%s%(mobile,password))return jsonify(codeRET.DBERR,msgret_map[RET.DBERR])is_login
user_blueprint.route(/,methods[GET])
def user_my():#获取当前登录的用户user_idsession[user_id]#查询当前用户的头像/用户名/手机号/并返回userUser.query.get(user_id)return jsonify(useruser.to_basic_dict())is_login
#个人信息获取用户名
user_blueprint.route(/auth,methods[GET])
def user_auth():#获取当前登录用户的编号user_idsession[user_id]#根据编号查询当前用户userUser.query.get(user_id)#返回用户的真实姓名身份证号return jsonify(user.to_auth_dict())is_login
#上传头像
user_blueprint.route(/,methods[PUT])
def user_profile():dictrequest.formif avatar1 in dict:try:#获取头像文件f1request.files[avatar]# print(f1)# print(type(f1))# from werkzeug.datastructures import FileStorage#mime-type:国际规范表示文件的类型如text/html,text/xml,image/png,image/jpeg..if not re.match(image/.*,f1.mimetype):return jsonify(codeRET.PARAMERR)except:return jsonify(codeRET.PARAMERR)# 上传到七牛云# access_key H999S3riCJGPiJOity1GsyWufw3IyoMB6goojo5e# secret_key uOZfRdFtljIw7b8jr6iTG-cC6wY_-N19466PXUAb# # 空间名称# bucket_name itcast20171104urlput_qiniu(f1)#如果未出错#保存用户的头像信息try:userUser.query.get(session[user_id])user.avatarurluser.add_update()except:logging.ERROR(u数据库访问失败)return jsonify(codeRET.DBERR)# 则返回图片信息return jsonify(codeRET.OK,urlcurrent_app.config[QINIU_URL] url)elif name in dict:#修改用户名namedict.get(name)#判断用户名是否存在if User.query.filter_by(namename).count():return jsonify(codeRET.DATAEXIST)else:userUser.query.get(session[user_id])user.namenameuser.add_update()return jsonify(codeRET.OK)else:return jsonify(codeRET.PARAMERR,msgret_map[RET.PARAMERR])is_login
#实名认证
user_blueprint.route(/auth,methods[PUT])
def user_auth_set():#接受参数dictrequest.formid_namedict.get(id_name)id_carddict.get(id_card)#验证参数合法性if not all([id_name,id_card]):return jsonify(codeRET.PARAMERR,msgret_map[RET.SESSIONERR])#验证身份合法性if not re.match(r^[1-9]\d{5}(19|20)\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$, id_card):return jsonify(codeRET.PARAMERR, msgret_map[RET.PARAMERR])#判断身份证号是否存在#修改数据对象try:userUser.query.get(session[user_id])except:logging.ERROR(u查询用户失败)return jsonify(codeRET.DBERR)try:user.id_cardid_carduser.id_nameid_nameuser.add_update()except:logging.ERROR(u修改用户姓名/身份证号失败)return jsonify(codeRET.DBERR)#返回数据return jsonify(codeRET.OK)#用户注册
user_blueprint.route(/session,methods[POST])
def user_login():#接收参数dictrequest.formmobiledict.get(mobile)passworddict.get(password)#验证非空if not all([mobile,password]):return jsonify(codeRET.PARAMERR,msgret_map[RET.PARAMERR])#验证手机号格式是否正确if not re.match(r^1[345789]\d{9}$,mobile):return jsonify(codeRET.PARAMERR,msgu手机号格式错误)#数据处理try:userUser.query.filter_by(phonemobile).first()except:logging.ERROR(用户登录--数据库出错)return jsonify(codeRET.DBERR,msgret_map[RET.DBERR])#判断手机号是否存在if user:#判断密码是否正确if user.check_pwd(password):session[user_id]user.idreturn jsonify(codeRET.OK,msguok)else:return jsonify(codeRET.PARAMERR,msgu密码不正确)else:return jsonify(codeRET.PARAMERR,magu手机号不存在)#用户登录
user_blueprint.route(/session,methods[GET])
def user_is_login():if user_id in session:userUser.query.filter_by(idsession[user_id]).first()return jsonify(codeRET.OK,nameuser.name)else:return jsonify(codeRET.DATAERR)#用户退出
user_blueprint.route(/session,methods[DELETE])
def user_logout():session.clear()return jsonify(codeRET.OK)