Flask项目

  • 认识前后端分离
  • 项目文件目录结构
    • 单一文件中构建所有依赖工具
    • 创建工程目录(对单一文件进行拆分)
    • 日志文件应用
  • 数据库设计
  • 为静态文件添加蓝图
  • crf防护

认识前后端分离

项目文件目录结构

单一文件中构建所有依赖工具

manage.py

# coding:utf-8from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_session import Session
from flask_wtf import CSRFProtectimport redis# 创建flask的应用对象
app = Flask(__name__)class Config(object):"""配置信息"""SECRET_KEY = "XHSOI*Y9dfs9cshd9"# 数据库SQLALCHEMY_DATABASE_URI = "mysql://root:mysql@127.0.0.1:3306/ihome_python04"SQLALCHEMY_TRACK_MODIFICATIONS = True# redisREDIS_HOST = "127.0.0.1"REDIS_PORT = 6379# flask-session配置SESSION_TYPE = "redis"SESSION_REDIS = redis.StrictRedis(host=REDIS_HOST, port=REDIS_PORT)SESSION_USE_SIGNER = True  # 对cookie中session_id进行隐藏处理PERMANENT_SESSION_LIFETIME = 86400 # session数据的有效期,单位秒app.config.from_object(Config)db = SQLAlchemy(app)# 创建redis连接对象
redis_store = redis.StrictRedis(host=Config.REDIS_HOST, port=Config.REDIS_PORT)# 利用flask-session,将session数据保存到redis中
Session(app)# 为flask补充csrf防护
CSRFProtect(app)@app.route("/index")
def index():return "index page"if __name__ == '__main__':app.run()

创建工程目录(对单一文件进行拆分)


ihome\ _ init _.py

# coding:utf-8from flask import Flask
from config import config_map
from flask_sqlalchemy import SQLAlchemy
from flask_session import Session
from flask_wtf import CSRFProtectimport redis
import logging
from logging.handlers import RotatingFileHandler# 数据库
db = SQLAlchemy()# 创建redis连接对象
redis_store = None# 配置日志信息
# 创建日志记录器,指明日志保存的路径、每个日志文件的最大大小、保存的日志文件个数上限
file_log_handler = RotatingFileHandler("logs/log", maxBytes=1024*1024*100, backupCount=10)
# 创建日志记录的格式                 日志等级    输入日志信息的文件名 行数    日志信息
formatter = logging.Formatter('%(levelname)s %(filename)s:%(lineno)d %(message)s')
# 为刚创建的日志记录器设置日志记录格式
file_log_handler.setFormatter(formatter)
# 为全局的日志工具对象(flask app使用的)添加日记录器
logging.getLogger().addHandler(file_log_handler)
# 设置日志的记录等级
logging.basicConfig(level=logging.DEBUG)  # 调试debug级# 工厂模式
def create_app(config_name):"""创建flask的应用对象:param config_name: str  配置模式的模式的名字 ("develop",  "product"):return:"""app = Flask(__name__)# 根据配置模式的名字获取配置参数的类config_class = config_map.get(config_name)app.config.from_object(config_class)# 使用app初始化dbdb.init_app(app)# 初始化redis工具global redis_storeredis_store = redis.StrictRedis(host=config_class.REDIS_HOST, port=config_class.REDIS_PORT)# 利用flask-session,将session数据保存到redis中Session(app)# 为flask补充csrf防护CSRFProtect(app)# 注册蓝图from ihome import api_1_0app.register_blueprint(api_1_0.api, url_prefix="/api/v1.0")return app

config.py

# coding:utf-8import redisclass Config(object):"""配置信息"""SECRET_KEY = "XHSOI*Y9dfs9cshd9"# 数据库SQLALCHEMY_DATABASE_URI = "mysql://root:mysql@127.0.0.1:3306/ihome_python04"SQLALCHEMY_TRACK_MODIFICATIONS = True# redisREDIS_HOST = "127.0.0.1"REDIS_PORT = 6379# flask-session配置SESSION_TYPE = "redis"SESSION_REDIS = redis.StrictRedis(host=REDIS_HOST, port=REDIS_PORT)SESSION_USE_SIGNER = True  # 对cookie中session_id进行隐藏处理PERMANENT_SESSION_LIFETIME = 86400  # session数据的有效期,单位秒class DevelopmentConfig(Config):"""开发模式的配置信息"""DEBUG = Trueclass ProductionConfig(Config):"""生产环境配置信息"""passconfig_map = {"develop": DevelopmentConfig,"product": ProductionConfig
}

manage.py

# coding:utf-8from ihome import create_app, db
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand# 创建flask的应用对象
app = create_app("develop")manager = Manager(app)
Migrate(app, db)
manager.add_command("db", MigrateCommand)if __name__ == '__main__':manager.run()

api_1_0\ _ init _.py

# coding:utf-8from flask import Blueprint# 创建蓝图对象
api = Blueprint("api_1_0", __name__)# 导入蓝图的视图
from . import demo

日志文件应用

demo.py

# coding:utf-8from . import api
from ihome import db
# import logging
from flask import current_app@api.route("/index")
def index():#print("hello")# logging.error()   # 记录错误信息# logging.warn()   # 警告# logging.info()   # 信息# logging.debug()   # 调试current_app.logger.error("error info")current_app.logger.warn("warn info")current_app.logger.info("info info")current_app.logger.debug("debug info")return "index page"# logging.basicConfig(level=logging.ERROR)

生成log日志

数据库设计


创建模型类
model.py

# -*- coding:utf-8 -*-from datetime import datetime
from . import dbclass BaseModel(object):"""模型基类,为每个模型补充创建时间与更新时间"""create_time = db.Column(db.DateTime, default=datetime.now)  # 记录的创建时间update_time = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now)  # 记录的更新时间class User(BaseModel, db.Model):"""用户"""__tablename__ = "ih_user_profile"id = db.Column(db.Integer, primary_key=True)  # 用户编号name = db.Column(db.String(32), unique=True, nullable=False)  # 用户暱称password_hash = db.Column(db.String(128), nullable=False)  # 加密的密码mobile = db.Column(db.String(11), unique=True, nullable=False)  # 手机号real_name = db.Column(db.String(32))  # 真实姓名id_card = db.Column(db.String(20))  # 身份证号avatar_url = db.Column(db.String(128))  # 用户头像路径houses = db.relationship("House", backref="user")  # 用户发布的房屋orders = db.relationship("Order", backref="user")  # 用户下的订单class Area(BaseModel, db.Model):"""城区"""__tablename__ = "ih_area_info"id = db.Column(db.Integer, primary_key=True)  # 区域编号name = db.Column(db.String(32), nullable=False)  # 区域名字houses = db.relationship("House", backref="area")  # 区域的房屋# 房屋设施表,建立房屋与设施的多对多关系
house_facility = db.Table("ih_house_facility",db.Column("house_id", db.Integer, db.ForeignKey("ih_house_info.id"), primary_key=True),  # 房屋编号db.Column("facility_id", db.Integer, db.ForeignKey("ih_facility_info.id"), primary_key=True)  # 设施编号
)class House(BaseModel, db.Model):"""房屋信息"""__tablename__ = "ih_house_info"id = db.Column(db.Integer, primary_key=True)  # 房屋编号user_id = db.Column(db.Integer, db.ForeignKey("ih_user_profile.id"), nullable=False)  # 房屋主人的用户编号area_id = db.Column(db.Integer, db.ForeignKey("ih_area_info.id"), nullable=False)  # 归属地的区域编号title = db.Column(db.String(64), nullable=False)  # 标题price = db.Column(db.Integer, default=0)  # 单价,单位:分address = db.Column(db.String(512), default="")  # 地址room_count = db.Column(db.Integer, default=1)  # 房间数目acreage = db.Column(db.Integer, default=0)  # 房屋面积unit = db.Column(db.String(32), default="")  # 房屋单元, 如几室几厅capacity = db.Column(db.Integer, default=1)  # 房屋容纳的人数beds = db.Column(db.String(64), default="")  # 房屋床铺的配置deposit = db.Column(db.Integer, default=0)  # 房屋押金min_days = db.Column(db.Integer, default=1)  # 最少入住天数max_days = db.Column(db.Integer, default=0)  # 最多入住天数,0表示不限制order_count = db.Column(db.Integer, default=0)  # 预订完成的该房屋的订单数index_image_url = db.Column(db.String(256), default="")  # 房屋主图片的路径facilities = db.relationship("Facility", secondary=house_facility)  # 房屋的设施images = db.relationship("HouseImage")  # 房屋的图片orders = db.relationship("Order", backref="house")  # 房屋的订单class Facility(BaseModel, db.Model):"""设施信息"""__tablename__ = "ih_facility_info"id = db.Column(db.Integer, primary_key=True)  # 设施编号name = db.Column(db.String(32), nullable=False)  # 设施名字class HouseImage(BaseModel, db.Model):"""房屋图片"""__tablename__ = "ih_house_image"id = db.Column(db.Integer, primary_key=True)house_id = db.Column(db.Integer, db.ForeignKey("ih_house_info.id"), nullable=False)  # 房屋编号url = db.Column(db.String(256), nullable=False)  # 图片的路径class Order(BaseModel, db.Model):"""订单"""__tablename__ = "ih_order_info"id = db.Column(db.Integer, primary_key=True)  # 订单编号user_id = db.Column(db.Integer, db.ForeignKey("ih_user_profile.id"), nullable=False)  # 下订单的用户编号house_id = db.Column(db.Integer, db.ForeignKey("ih_house_info.id"), nullable=False)  # 预订的房间编号begin_date = db.Column(db.DateTime, nullable=False)  # 预订的起始时间end_date = db.Column(db.DateTime, nullable=False)  # 预订的结束时间days = db.Column(db.Integer, nullable=False)  # 预订的总天数house_price = db.Column(db.Integer, nullable=False)  # 房屋的单价amount = db.Column(db.Integer, nullable=False)  # 订单的总金额status = db.Column(  # 订单的状态db.Enum("WAIT_ACCEPT",  # 待接单,"WAIT_PAYMENT",  # 待支付"PAID",  # 已支付"WAIT_COMMENT",  # 待评价"COMPLETE",  # 已完成"CANCELED",  # 已取消"REJECTED"  # 已拒单),default="WAIT_ACCEPT", index=True)comment = db.Column(db.Text)  # 订单的评论信息或者拒单原因

为静态文件添加蓝图

放入静态文件

utils目录新增 commons.py

# coding:utf-8from werkzeug.routing import BaseConverter# 定义正则转换器
class ReConverter(BaseConverter):""""""def __init__(self, url_map, regex):# 调用父类的初始化方法super(ReConverter, self).__init__(url_map)# 保存正则表达式self.regex = regex

_ init _.py 新增

web_html.py

# coding:utf-8from flask import Blueprint, current_app, make_response
from flask_wtf import csrf# 提供静态文件的蓝图
html = Blueprint("web_html", __name__)# 127.0.0.1:5000/()
# 127.0.0.1:5000/(index.html)
# 127.0.0.1:5000/register.html
# 127.0.0.1:5000/favicon.ico   # 浏览器认为的网站标识, 浏览器会自己请求这个资源@html.route("/<re(r'.*'):html_file_name>")
def get_html(html_file_name):"""提供html文件"""# 如果html_file_name为"", 表示访问的路径是/ ,请求的是主页if not html_file_name:html_file_name = "index.html"# 如果资源名不是favicon.icoif html_file_name != "favicon.ico":html_file_name = "html/" + html_file_name# 创建一个csrf_token值csrf_token = csrf.generate_csrf()# flask提供的返回静态文件的方法resp = make_response(current_app.send_static_file(html_file_name))# 设置cookie值resp.set_cookie("csrf_token", csrf_token)return resp

crf防护

crf防护过程

未开启crf防护

开启crf防护

设置
init文件添加

视图中添加

Flask项目(一)前后端分离、项目目录结构、数据库设计、CRF相关推荐

  1. 驾校分期-众筹项目java前后端分离项目vue(微信小程序+java前后端源码下载)

    可以idea直接打开,mysql数据库项目,前后端分离项目vue,分期可自动设置,自动换算金额 驾校分期-众筹项目java前后端分离项目vue(微信小程序+java前后端源码下载)

  2. p6 软件 服务器没有项目了,前后端分离项目一台服务器上线

    一.购买服务器 这里有几点注意 选择配置 linux 系统的时候最好选择centos7+不要选择centos6+ 配置开发端口最好把常用端口打开以及运行端口最好多开几个防止后续nginx 启动网页没法 ...

  3. 一套仿阿里完整版Spring Boot电商项目,前后端分离+权限管理系统

    项目简介 1.项目背景 2. B2B 模式 3. B2C 模式 ==(商城模式)*== 4. C2B 模式 5. C2C 模式 6. O2O 模式 2.商城架构图 2.1.前后端分离 基础版 2.3. ...

  4. phython在file同时写入两个_喜大普奔,两个开源的 Spring Boot + Vue 前后端分离项目可以在线体验了

    折腾了一周的域名备案昨天终于搞定了. 松哥第一时间想到赶紧把微人事和 V 部落部署上去,我知道很多小伙伴已经等不及了. 1. 也曾经上过线 其实这两个项目当时刚做好的时候,我就把它们部署到服务器上了, ...

  5. iis cgi 无法使用_ASP.NET Core前后端分离项目使用gitlabci持续集成到IIS

    (给DotNet加星标,提升.Net技能) 转自:饭勺oOcnblogs.com/fanshaoO/p/12054985.html 现在好多使用gitlab-ci的持续集成的教程,大部分都是发布到li ...

  6. 前后端分离项目部署(服务器或本地)

    文章目录 前后端分离项目部署(服务器或本地) 前端部署(以vue项目为例) 后端部署(以Springboot项目为例) 补充 前后端分离项目部署(服务器或本地) 前端部署(以vue项目为例) 部署环境 ...

  7. Vue 实现前后端分离项目

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. Vue实现前后端分离项目的初体验 经过之前学习的Vue的知识: vue基本指令 vue组件 vue- ...

  8. RuoYi-Vue 部署 Linux环境 若依前后端分离项目(jar包+nginx 多机版本)

    接上一篇:RuoYi-Vue 部署 Linux环境 若依前后端分离项目(jar包+nginx 单机版本) 前端和后端不在一个服务器上,如何部署呢? 文章目录 1. 服务器和软件部署 2. 后端部署 3 ...

  9. RuoYi-Vue 部署 Linux环境 若依前后端分离项目(jar包+nginx 单机版本)

    文章目录 一.软件安装部署 1. 安装jdk 2. mysql8安装部署 3. redis安装 4. nginx 安装部署 5. 克隆项目 二.后端项目 2.1. 修改数据库连接 2.2. 修改Red ...

  10. php node.js django,Vue.js和Django搭建前后端分离项目示例详解

    本篇文章主要介绍了Django+Vue.js搭建前后端分离项目的示例,具有一定参考价值,有兴趣的可以了解一下 在写这篇文章的时候,顺带学习了一下关于Markdown的使用方法. 笔者是个渣渣,一切都是 ...

最新文章

  1. Kubernetes的未来是虚拟机?
  2. vs2017运行yolov4_windows10+vs2017+opencv3.4.1配置YOLOV4
  3. Java 洛谷 提交完题目的代码之后一直停留在 ( 正在等待编译……),刷新页面之后 ,显示 Unaccepted 0分
  4. 慎用url重写(转)
  5. 如何在Office 2007中查看关于对话框和版本信息
  6. Linux tty驱动程序一 架构
  7. 科学家调查了72名图灵奖得主背景,却发现计算机专业很难得奖!
  8. python - EDA - 1 统计缺失值
  9. [翻译]Writing Custom Wizards 编写自定义的向导
  10. 一键加速去不掉加锁的_十年斑点去不掉,大妈巧用蜂蜜擦脸,皮肤白净还年轻...
  11. 断言失败的vc++文档_了解C / C ++中的断言
  12. Spring Data Jpa 查询返回自定义对象
  13. codejock(codejock chart类)
  14. MySQL数据库面试题(2022年最新版45题)
  15. 【算法】牛顿迭代法求平方根及多次方根
  16. 如何回答「你的优势和劣势是什么」?【面试核心问题6】
  17. int 和Interger的区别
  18. 商汤科技面试——AI算法岗
  19. Intellij IDEA 一些让人爱不释手的小技巧
  20. labview dsn连接mysql_labview使用DSN与数据库的连接包括access,mysql

热门文章

  1. 冰封王座人工只能_人工智能能否在RA2中完胜人类高手?任务模式可否自行通关?...
  2. 酒店小程序优秀开发案例简介
  3. 服务器内存用完查看命令
  4. 面向对象有哪些特征?
  5. 达人评测 realme Book 增强版 Air 怎么样
  6. IPM++_初识运营的萌感
  7. 新版chrome浏览器字体编码插件
  8. 用swing设计一个打地鼠小游戏_设计小游戏 | 用游戏的方式让你迅速掌握钢笔工具!...
  9. win7加入win2003域
  10. c语言中bool库函数,C语言中的bool