工程创建和配置
- 本章主题
- 关键词
- 准备工作
- 测试创建 Flask 工程
- 项目配置文件创建
- 配置开发环境 config.py 文件
- 新建配置文件
- 确认需要配置哪些信息
- 配置 MySQL 数据库
- 安装所需模块
- 数据库的配置信息
- 创建并连接 数据库
- 配置 Redis
- 安装 redis 扩展包
- redis 的配置信息
- 创建并链接 Redis
- 配置 Flask-Session
- 安装所需模块
- Flask-Session 的配置信息
- 绑定 Flask-Session
- 除了三面这 3个 主要配置外的一些附加配置
- Post请求(wtf)
- 汇总一下指定开发环境配置文件:config.py 文件
- 项目设计模式
- 工厂模式
- 配置工程日志 logs 文件
- 配置日志
- 日志目录
- 将 日志 放进项目中
- 日志记录器的使用
- 配置前端静态文件
- 准备静态文件
- 未完继续整理
- 指定静态文件加载文件
- 数据库中表的创建
- 总结小便条
本章主题
关键词
准备工作
创建虚拟环境
pipenv shell
安装Flask框架
pip install flask
创建Flask工程。
测试创建 Flask 工程
点击工作台返回的地址: http://127.0.0.1:5000/ ;确认返回信息:
通过浏览器返回的信息可以确定 Flask 工程的创建以及前期的准备没问题。
项目配置文件创建
确认过 Flask 工程 的创建以及前期的准备没问题后,测试文件 app.py
成功的完成了他的历史使命,可以删除了;接下来我们来创建 Flask 工程 必备的那些文件。
首先我们要创建两夹两包。分别是:
管理业务逻辑的:lghome 包 ;
管理项目运行日志的:logs 包 ;
管理项目配置文件的:config.py 文件 ;
管理入口文件的:manage.py 文件 。
接下来再来介绍一下 管理业务逻辑的 lghome 包里的四个文件负责的功能都是什么:
api_vi_0 文件夹的主要功能是:v1_0 版本的主要功能业务逻辑存放点 ;
libs 文件夹的主要功能是:第三方功能存放点 ;
static 文件夹的主要功能是:静态资源文件存放点 ;
utils 文件夹的主要功能是:自定义工具文件存放点 ;
_init_.py 文件的主要功能是:管理项目运行的业务逻辑的管理文件 ;
web_html.py 文件的主要功能是:前端资源的入口管理文件。
配置开发环境 config.py 文件
新建配置文件
- 准备配置文件目录
- 准备开发环境配置内容
确认需要配置哪些信息
在完成 配置文件 的新建后,接下来我们一起来看下在 配置文件 里需要准备哪些内容:
class Config(object):
"""配置信息"""
# 数据库
# Redis
# Flask-Session
接下来,我们分别来完成这三块内容的配置:
配置 MySQL 数据库
安装所需模块
pip install flask_sqlalchemy
数据库的配置信息
class Config(object):
"""配置信息"""
# 数据库五元素
USERNAME = 'root'
PASSWORD = 'root'
HOSTNAME = '127.0.0.1'
PORT = 3306
DATABASE = 'home'
# 数据库链接 URL
SQLALCHEMY_DATABASE_URI = 'mysql+mysqlconnector://{}:{}@{}:{}/{}'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
SQLALCHEMY_TRACK_MODIFICATIONS = True
创建并连接 数据库
app.config.from_object(Config)
db = SQLAlchemy(app)
配置 Redis
安装 redis 扩展包
pip install redis
redis 的配置信息
数据缓存服务采用Redis数据库
import redis # 导入 redis 模块
class Config(object):
"""配置信息"""
# Redis 配置
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379
创建并链接 Redis
redis_store = redis.Redis(host=Config.REDIS_HOST, port=config_class.REDIS_PORT)
配置 Flask-Session
安装所需模块
pip install Flask-Session
Flask-Session 的配置信息
class Config(object):
"""配置信息"""
# Flask-Session
SECRET_KEY = 'ASDFFGTRGRVX' # session 签名定义 的 加盐
SESSION_TYPE = 'redis' # session 存储位置
SESSION_REDIS = redis.Redis(host=REDIS_HOST, port=REDIS_PORT) # session 链接存储位置
SESSION_USE_SIGNER = True # session 签名定义
PERMANENT_SESSION_LIFETIME = 86400 # session 有效时间定义 单位:s
绑定 Flask-Session
app.config.from_object(Config)
Session(app)
除了三面这 3个 主要配置外的一些附加配置
Post请求(wtf)
Post请求(wtf)的主要功能:验证表单的 csrf。
import flask_wtf import CSRFProtect
class Config(object):
"""配置信息"""
......
app.config.from_object(Config)
CSRFProtect(app)
之后,在项目里,如果提交 POST 请求的话,都会通过这个 csrf 的验证。
有关这个 csrf 的如何验证前端表单的细解,我会在后面细讲。
汇总一下指定开发环境配置文件:config.py 文件
import redis
class Config(object):
"""配置信息"""
# 数据库 链接配置
HOSTNAME = '127.0.0.1'
PORT = 3306
USERNAME = 'root'
PASSWORD = 'root'
DATEBASE = 'homes'
# 链接 数据库
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATEBASE)
SQLALCHEMY_TRACK_MODIFICATIONS = True
# Redis 配置
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379
# Flask-Session
SECRET_KEY = 'ASDFFGTRGRVX' # session 签名定义 的 加盐
SESSION_TYPE = 'redis' # session 存储位置
SESSION_REDIS = redis.Redis(host=REDIS_HOST, port=REDIS_PORT) # session 链接存储位置
SESSION_USE_SIGNER = True # session 签名定义
PERMANENT_SESSION_LIFETIME = 86400 # session 有效时间定义 单位:s
class DevConfig(Config): # 开发环境 Development
"""开发环境"""
DEBUG = True
class ProConfig(Config): # 生产环境 Project
"""生产环境"""
# 工厂模式 的 前期铺垫
config_map = {
'dev':DevConfig,
'pro':ProConfig
}
项目设计模式
只要从事计算机开发,有会有一个必须经过的 基础性话题 :设计模式。那什么是 设计模式 呢?
简单的介绍一下:设计模式 就是为了 优化代码 ,优化开发 ,优化程序运转 的一种逻辑计算方法。我们统称为 设计模式。
再简单直白的解释:一切为工程开发做优化和简化的方法都叫 设计模式。
本篇介绍第一个 设计模式 :工厂模式。
之后在我 Flask框架项目 学习开发的过程中,陆陆续续的会介绍各种不同的开发模式。
工厂模式
项目的环境分为 开发环境 和 生产环境:
- 开发环境:用于编写和调试项目代码;
- 生产环境:用于项目线上部署运行。
前面我们完成了 配置类 Config 的定义,但是项目的环境分为 开发环境 和 生产环境,那我们怎么确定什么时候调用 配置类 Config 呢?这个时候就需要用到 工厂模式 了。
首先,我们需要把 配置类 Config 存放到管理配置信息的 Config.py 文件
中,并且在 Config.py 文件
中创建两个类,分别是管理 开发环境 的 DevConfig(Config)
类 和 管理 生成环境 的 ProConfig(Config)
类,这两个类都是继承 配置类Config
的子类;在最后创建一个管理两个两个类的 字典config_map
,方便后续对他们的调用。
class Config(object):
"""配置信息"""
......
class DevConfig(Config): # 开发环境 Development
"""开发环境"""
DEBUG = True
class ProConfig(Config): # 生产环境 Project
""""""
# 工厂模式 的 前期铺垫
config_map = {
'dev':DevConfig,
'pro':ProConfig
}
我们先介绍一下,如果不用 工厂模式 但又想在 管理业务逻辑的 lghome 包里的 _init_.py 文件想要调用 不同模式的 Config
类来创建 app
该怎么操作:
from config import DevConfig, ProConfig
def create_app(config_name):
app = Flask(__name__)
# 传统模式
if config_name == 'dev':
from config import DevConfig
app.config.from_object(DevConfig)
else:
from config import ProConfig
app.config.from_object(ProConfig)
return app
接下来我们一起来对比一下,用 工厂模式 在 管理业务逻辑的 lghome 包里的 _init_.py 文件想要调用 不同模式的 Config
类来创建 app
该怎么操作:
from config import config_map
def create_app(config_name):
app = Flask(__name__)
config_class = config_map.get(config_name) # 工厂模式调用需要用的 xx环境
app.config.from_object(config_class) # 加载配置文件类
return app
6 : 2 ,这就是 设计模式 的魅力。
既然,我们现在已经通过 设工程模式 对 app
的创建进行了优化,那么我们直接就完成 管理业务逻辑的 lghome 包里的 _init_.py 文件的功能定义:
from flask import Flask
from config import config_map # 配置信息文件
from flask_sqlalchemy import SQLAlchemy # 数据库
from flask_session import Session # Session
from flask_wtf import CSRFProtect # 表单验证
import redis
db = SQLAlchemy() #
redis_store = None # Redis
def create_app(config_name):
app = Flask(__name__)
config_class = config_map.get(config_name) # 工厂模式
app.config.from_object(config_class) # 加载配置文件类
db.init_app(app) # 使用 app 初始化 db 什么时候调用,什么时候再绑定
global redis_store # 将 redis_store 定义为一个 全局变量
redis_store = redis.Redis(host=config_class.REDIS_HOST, port=config_class.REDIS_PORT) # 创建 Redis 链接
Session(app) # session 绑定
CSRFProtect(app) # post 请求 wtf csrf
return app
配置工程日志 logs 文件
工程日志的功能是为了 记录 项目 自启动后 的 每一步 的 操作 及 反馈结果 。
配置日志
def setup_log():
# 设置日志的的登记 DEBUG调试级别
logging.basicConfig(level=logging.DEBUG)
# 创建日志记录器,设置日志的保存路径和每个日志的大小和日志的总大小
file_log_handler = RotatingFileHandler("logs/log.log", maxBytes=1024*1024*100,backupCount=100)
# 创建日志记录格式,日志等级,输出日志的文件名 行数 日志信息
formatter = logging.Formatter("%(levelname)s %(filename)s: %(lineno)d %(message)s")
# 为日志记录器设置记录格式
file_log_handler.setFormatter(formatter)
# 为全局的日志工具对象(flaks app使用的)加载日志记录器
logging.getLogger().addHandler(file_log_handler)
日志目录
在 项目目录 下新建一个 logs文件夹 。
将 日志 放进项目中
import logging
from logging.handlers import RotatingFileHandler
def setup_log():
......
def create_app(config_name):
setup_log()
app = Flask(__name__)
......
有没有发现 setup_log()
放在 app = Flask(__name__)
的上面。为什么呢?按理说,不该是 app = Flask(__name__)
最大吗?
按日常代码顺序来说 app = Flask(__name__)
确实是老大,下面的 小弟们 都是看着它吃饭的,但是 setup_log()
是本项目的 书记员 ;懂得成年朋友们都懂:班长 是用来管下面 所有的 小弟 的,但是 书记员 是用来 监督 班长的;书记员 虽然没什么 实权,但是 班长 的 每个动作,班长带 小弟们 的 每个操作,小弟们 在下面的 每个操作,书记员 都要记录清清楚楚,需要向老板我汇报的。😃
日志记录器的使用
import logging
# 创建日志记录器
logger = logging.getLogger('django')
# 输出日志
logger.debug('测试logging模块debug')
logger.info('测试logging模块info')
logger.error('测试logging模块error')
配置前端静态文件
项目中需要使用静态文件,比如css,images,js等等
准备静态文件
在项目目录下新建一个 static 目录
未完继续整理
指定静态文件加载文件
from flask import Blueprint, current_app, make_response
# 提供静态文件的蓝图
html = Blueprint('web_html', __name__)
@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.ico
# if html_file_name != "favicon.ico":
html_file_name = "html/" + html_file_name
return make_response(current_app.send_static_file(html_file_name))
数据库中表的创建
总结小便条
本篇文章主要讲了以下几点内容:
- manage.py 文件 :
from lghome import create_app, db
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
app = create_app('dev')
# 数据库迁移
manage = Manager(app)
Migrate(app, db)
manage.add_command('db', MigrateCommand)
if __name__ == '__main__': # 启动
manage.run()
- config.py 文件 :
import redis
class Config(object):
"""配置信息"""
# 数据库 链接配置
HOSTNAME = '127.0.0.1'
PORT = 3306
USERNAME = 'root'
PASSWORD = 'root'
DATEBASE = 'homes'
# 链接 数据库
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATEBASE)
SQLALCHEMY_TRACK_MODIFICATIONS = True
# Redis 配置
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379
# Flask-Session
SECRET_KEY = 'ASDFFGTRGRVX' # session 签名定义 的 加盐
SESSION_TYPE = 'redis' # session 存储位置
SESSION_REDIS = redis.Redis(host=REDIS_HOST, port=REDIS_PORT) # session 链接存储位置
SESSION_USE_SIGNER = True # session 签名定义
PERMANENT_SESSION_LIFETIME = 86400 # session 有效时间定义 单位:s
class DevConfig(Config): # 开发环境 Development
"""开发环境"""
DEBUG = True
class ProConfig(Config): # 生产环境 Project
"""生产环境"""
# 工厂模式 的 前期铺垫
config_map = {
'dev':DevConfig,
'pro':ProConfig
}
- 管理业务逻辑的 lghome 包里的 _init_.py 文件:
from flask import Flask
from config import config_map # 配置信息文件
from flask_sqlalchemy import SQLAlchemy # 数据库
import redis # Redis
from flask_session import Session # Session
from flask_wtf import CSRFProtect # 表单验证
import logging # 日志
from logging.handlers import RotatingFileHandler # 日志用到的方法
db = SQLAlchemy() #
redis_store = None # Redis
def setup_log(): # 日志的创建以及定义
# 设置日志的的登记 DEBUG调试级别
logging.basicConfig(level=logging.DEBUG)
# 创建日志记录器,设置日志的保存路径和每个日志的大小和日志的总大小
file_log_handler = RotatingFileHandler("logs/log.log", maxBytes=1024*1024*100,backupCount=100)
# 创建日志记录格式,日志等级,输出日志的文件名 行数 日志信息
formatter = logging.Formatter("%(levelname)s %(filename)s: %(lineno)d %(message)s")
# 为日志记录器设置记录格式
file_log_handler.setFormatter(formatter)
# 为全局的日志工具对象(flaks app使用的)加载日志记录器
logging.getLogger().addHandler(file_log_handler)
def create_app(config_name):
setup_log()
app = Flask(__name__)
config_class = config_map.get(config_name) # 工厂模式
app.config.from_object(config_class) # 加载配置文件类
db.init_app(app) # 使用 app 初始化 db 什么时候调用,什么时候再绑定
global redis_store # 将 redis_store 定义为一个 全局变量
# 创建 Redis 链接
redis_store = redis.Redis(host=config_class.REDIS_HOST, port=config_class.REDIS_PORT)
Session(app) # session 绑定
CSRFProtect(app) # post 请求 wtf csrf
return app
- 静态界面资源及数据库模型下载链接:https://pan.baidu.com/s/1y78s1Hb0c6Gd-I8ESYgQ8Q 提取码:h0gi
本章回顾暂时就到这了,如果还有点晕,那就把文章里所有引用的案例代码再敲几遍吧。拜拜~