工程创建和配置

  • 本章主题
  • 关键词
  • 准备工作
  • 测试创建 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工程。

Python jackknife实现 python flake_python

  

测试创建 Flask 工程

Python jackknife实现 python flake_python_02


  

  点击工作台返回的地址: http://127.0.0.1:5000/ ;确认返回信息:

Python jackknife实现 python flake_Python jackknife实现_03

  通过浏览器返回的信息可以确定 Flask 工程的创建以及前期的准备没问题。

  

项目配置文件创建

  确认过 Flask 工程 的创建以及前期的准备没问题后,测试文件 app.py 成功的完成了他的历史使命,可以删除了;接下来我们来创建 Flask 工程 必备的那些文件。

  首先我们要创建两夹两包。分别是:
    管理业务逻辑的:lghome 包 ;
    管理项目运行日志的:logs 包 ;
    管理项目配置文件的:config.py 文件 ;
    管理入口文件的:manage.py 文件 。

Python jackknife实现 python flake_mysql_04

  接下来再来介绍一下 管理业务逻辑的 lghome 包里的四个文件负责的功能都是什么:
    api_vi_0 文件夹的主要功能是:v1_0 版本的主要功能业务逻辑存放点 ;
    libs 文件夹的主要功能是:第三方功能存放点 ;
    static 文件夹的主要功能是:静态资源文件存放点 ;
    utils 文件夹的主要功能是:自定义工具文件存放点 ;
    _init_.py 文件的主要功能是:管理项目运行的业务逻辑的管理文件 ;
    web_html.py 文件的主要功能是:前端资源的入口管理文件。

Python jackknife实现 python flake_flask_05

  

配置开发环境 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))

  

数据库中表的创建

  

总结小便条

本篇文章主要讲了以下几点内容:

  1. 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()
  1. 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
}
  1. 管理业务逻辑的 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
  1. 静态界面资源及数据库模型下载链接:https://pan.baidu.com/s/1y78s1Hb0c6Gd-I8ESYgQ8Q              提取码:h0gi

  

  本章回顾暂时就到这了,如果还有点晕,那就把文章里所有引用的案例代码再敲几遍吧。拜拜~