第一步:配置信息的抽取

先在news_iy03目录下创建一个config文件用来存放配置代码。

 

configmap 内容填写 from config import config_导包

 然后将class下的所有配置代码放进config文件里。

configmap 内容填写 from config import config_mysql_02

这里你会发现StrictRedis报错,不过没关系,用alt加回车就可以导包

config文件处理好了之后回到manage文件里我们需要导入config这个配置类

from config import Config

第二步:app信息的抽取

首先创建一个info文件来存放app信息(注意要创建的是python package这个文件夹)然后将app信息放进info自带的init文件里

configmap 内容填写 from config import config_configmap 内容填写_03

这里爆红的代码我们不能用快速导包了,要去manage里将那些灰色的导包代码放过来(就是上面那些注释掉的代码)

回到manage里会发现下面的代码是红色就需要加入一个导包代码

configmap 内容填写 from config import config_日志记录_04

 代码:

from info import app,db

 

第三步:工厂方式建立app

首先我们需要在配置类config文件中写三个环境:开发环境,生产环境,测试环境

class DevelopmentConfig(Config):
    #开发环境
    pass

class ProductionConfig(Config):
    #生产环境
    DEBUG = False
    SQLALCHEMY_DATABASE_URI = 'mysql://root:mysql@127.0.0.1:3306/demo'
class TestConfig(Config):
    #测试环境
    pass

配置信息写好后,接着我们去init里去创建所需的app

先导入三个环境:

from config import DevelopmentConfig,ProductionConfig,TestConfig

导入之后根据不同的需求创建不同的app,但是如果要根据不同的的需求来创建app就会很麻烦,所有我们使用函数来创建

def create_app():
    app = Flask(__name__)     #创建app
    app.config.from_object(configs)    #指定配置类
    db = SQLAlchemy(app)  #创建mysql链接对象
    redis_store = StrictRedis(host=config.REDIS_HOST, port=config.REDIS_PORT)   #建立redis链接对象
    # 开启CSRF保护:因为项目中的表单不再使用FlaskForm来实现,所以不会自动地开启CSRF保护,需要我们自己开启
    CSRFProtect(app)  #开启CSRF保护
    Session(app)   #配置redis的存放数据库

 因为使用函数来创建app,所以我们之前的app和db就找不到了

我们就先从info里导入create_app,然后完成创建

from info import create_app

app = create_app()

接着去写init里的函数,因为我们是三个环境,所以我们将三个环境写在一起

在config里的配置类下写入代码:

configs = {
    "dev" : DevelopmentConfig,
    "pro" : ProductionConfig,
    "test" : TestConfig
}

在写入函数前先将configs导入init里

from config import configs

在manage里的写入参数

app = create_app("dev")

然后在init里写入变量env来接收配置信息

configmap 内容填写 from config import config_导包_05

写完之后去运行会发现有一个函数没有返回值的错误,所以要在init下面写入一个代码:

return app

这里写完之后我们发现db是爆红的,所以问我们先把db给注释掉

第四步:db问题解决

我们之前写的代码有一个地方没有解决就是db,但因为db在函数里面我们是处理不了的,所以只能把db给拿出来

configmap 内容填写 from config import config_mysql_06

这里app还是报错的,我们去源码里看看

configmap 内容填写 from config import config_mysql_07

我们再接着进入init_app源码

configmap 内容填写 from config import config_导包_08

所以我们先不给它app,因为它有对象所以我们就手动写这个db.init_app(app)

configmap 内容填写 from config import config_导包_09

 

第五步:日志的集成

首先将日志的代码写入,因为日志的等级比较高,使用我们把它放在def函数上面

# 设置日志的记录等级
    logging.basicConfig(level=logging.DEBUG) # 调试debug级
    # 创建日志记录器,指明日志保存的路径(前面的logs为文件的名字,需要我们手动创建,后面则会自动创建)、每个日志文件的最大大小、保存的日志文件个数上限。
    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)

会有一些爆红,这里使用快速导包就行,导完之后运行会发现报错,报错的原因是没有存放logs的地方,所以在news_it03创建一个普通文件夹logs(如果还报错可以在目录那加一个.)

configmap 内容填写 from config import config_日志记录_10

日志和工厂差不多都是不同的开发环境就对日志的级别有不一样的,所以我们就仿照工厂来写日志

所以先写一个函数并在app创建前调用它

configmap 内容填写 from config import config_日志记录_11

在函数里面加入一个变量名level来接收参数,下面的也是用level来接收

configmap 内容填写 from config import config_configmap 内容填写_12

然后工厂里的setup_log()也需要参数,所以我们去开发环境和生产环境里去写一些特制的属性

import logging

class DevelopmentConfig(Config):
    #开发环境
    LEVEL_LOG = logging.DEBUG

class ProductionConfig(Config):
    #生产环境
    DEBUG = False
    SQLALCHEMY_DATABASE_URI = 'mysql://root:mysql@127.0.0.1:3306/demo'
    LEVEL_LOG = logging.ERROR

参数就可以写了

setup_log(configs[env].LEVEL_LOG)

 

第六步:蓝图的抽取

我们将业务逻辑统一放在了info文件夹中,而项目中我们又会分为很多的业务模块,比如用户模块、订单模块等。

在info的业务逻辑模块中,除了放业务模块还会放其他内容,所以我们需要新建一个文件夹来专门存放这些业务模块。

这里,我们在info下新建一个名为modules的文件夹来存放它们。

configmap 内容填写 from config import config_日志记录_13

我们在modules中新建一个名为index的python package文件夹用于存放主页的相关内容,并在这个文件夹中新建一个views.py来存储视图函数相关内容。

我们将默认的视图函数与路由拿出来放到views.py中,并完成适当修改:

@app.route("/")
def index():
    # 测试Redis连接是否成功
    # redis_store.set("name", "laowang")
    #测试session
    # session["age"] = 20
    return 'Hello World!'

创建蓝图并注册

from flask import Blueprint

index_blue = Blueprint("index",__name__)
@index_blue.route("/")
def index():
    # 测试Redis连接是否成功
    # redis_store.set("name", "laowang")
    #测试session
    # session["age"] = 20
    return 'Hello World!'

然后在info里的init导入蓝图并注册

from info.modules.index.views import index_bule



#这里是写在工厂里的app = Flask(__name__)下
app.register_blueprint(index_blue)

在index模块的初始化init文件中创建蓝图,也就是把views里的蓝图代码丢过去

info -> modules -> index -> __init__.py

from flask import Blueprint

index_blue = Blueprint("index", __name__)

from . import views

代码丢过去后,我们需要在views里重新导入

from . import index_bule