4.工厂方式建立

上面我们把config信息抽取完成还有app设置。

我们还需要考虑一件事情,在我们环境我们一般有三个环境,一般都是测试环境,开发环境,生产环境

这三个环境我们在config里面设置。因为抽取了就应该在固定的位置编写

我们class一个数我这边定义Development,把配置环境Config交到里面,现在还不知道怎么写我们就pass停止,后面的测试和生产一个道理

class DevelopmentConfig(config):
  #开发环境
pass
class ProductionConfig(Config):
    #生产环境
    pass
class TestConfig(Config):
    #测试环境
    pass

这样我们的三个环境就成了,成了后我们就完成基本的配置,一般来说我们的开发环境,和我们当前的Config配置是一样的,所以我们在后生产环境后面写pass就不做修改。而生产环境不一样,我们把DEBUG稍微的修改一下。

class ProductionConfig(Config):
    #生产环境
    DEBUG = False #这里表示我们不开启DEBUG  

还有一般我们开发和生产的数据库也需要修改,因为你做开发的时候肯定会做增删改查的一个工作等,所以我们不能操作线上的真实的数据库。所以我们会专门给一个测试数据库。

class ProductionConfig(Config):
    #生产
    DEBUG = False
    SQLALCHEMY_DATABASE_URI = "mysql://root:mysql@127.0.0.1:3306/demo"  

这里我们就写一个demo代表生产数据库,现在我们基本的就配置完成。

 

现在我们去__init__.py里面。根据我们不同的配置信息来创建我们的app。

我们把这行代码注释

from config import Config 

重新导入三个环境

from config import DevelopmentConfig,ProductionConfig,TestConfig
#分别是开发,生产,测试

导入后我们根据不同而需求来创建app。

如果是生产环境,三个地方要做修改

 

 

 

 变成

app.config.from_object(DevelopmentConfig)
db = SQLAlchemy(app)
redis_store = StrictRedis(host=DevelopmentConfig.REDIS_HOST, port=DevelopmentConfig.REDIS_POST)

 如果是测试环境或者开发环境还是一样,但是这样的不好用,改的太多太多了。

所以我我们建立一个函数来接收一个参数。  

def create_app("参数"): 

完整代码

def create_app("参数"):
    app = Flask(__name__)
    app.config.from_object(DevelopmentConfig)
    db = SQLAlchemy(app)
    redis_store = StrictRedis(host=DevelopmentConfig.REDIS_HOST, port=DevelopmentConfig.REDIS_POST)
    Session(app)   #设置redis的存放数据库
    CSRFProtect(app)#开始CSRF保护开启
完整改动代码

 

这个参数能够指定我们建立什么环境的app,因为所有的app都通过配置类来进行初始化,我们能够通过指定的环境来创建指定的app。

我们来到mange,如果我们做了这件事情

from info import app,dbwomme
就不能找到app,所有我们先把这两行代码进行注释。

from info import app,db Migrate(app, db)#创建APP和db的链接

为什么没找到呢?那是因为我们把__init__.py里的app甩到create_app函数里面去了。正常来说没有函数就不要报错。但是我们把app甩到函数里面去了。但是有人问为什么要这样呢?因为我们在app里面创建环境很难,所以我们甩进函数,用函数来指定什么环境,然后叫函数里面的app进行初始化创建。我们把manage里面的这几行代码全都注释掉。

#from info import app,db
# manager = Manager(app)#建立脚本管理者
# Migrate(app, db)#创建APP和db的链接
# manager.add_command("mysql",MigrateCommand)#创建mysql的脚本命令 

来到__init__.py既然我们app都用函数来搞,那么回到manage,我们导入

from info import create_app
app=create_app() 

通过app来接收函数app的建立,随后把着两个注释解开,因为db的问题还没处理,所以我们暂时不解开。

# manager = Manager(app)#建立脚本管理者

# manager.add_command("mysql",MigrateCommand)#创建mysql的脚本命令   

这个时候app可以建立,建立的时候我们还需要参数,这时候我们来到config里面写一个字典。

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

现在我们在字典里完成一个键一个值,我们用字典把三个值分别放到字典里三个值里面。来到__init__.py里面我们两行代码就不要了

# from config import Config
from config import DevelopmentConfig,ProductionConfig,TestConfig

不要了,直接删除。

我们直接把字典导进来

from config import configs

 来到manage,

app = create_app("dev")

dev参数一半过去后,来到__init__.py里面,拿env接收

def create_app(env):

这里env来接收app的配置信息

然后把这三个地方全部修改成configs[env]

 

 

 我们运行后会发现报错

 

 

 那是因为我们__init__.py的函数只管接收没有返回值。我们在最后retrun一个app。

 return app 

 再次运行我们就会运行成功

 

 

下面对比一下代码,分别是__init__.py,manage,config.

from flask import Flask,session
from flask_sqlalchemy import SQLAlchemy
from redis import StrictRedis
from flask_session import Session
from flask_wtf import CSRFProtect
from config import configs
#以工厂方式来创建app
def create_app(env):
    app = Flask(__name__)
    app.config.from_object(configs[env])
    db = SQLAlchemy(app)
    redis_store = StrictRedis(host=configs[env].REDIS_HOST, port=configs[env].REDIS_POST)
    Session(app)   #设置redis的存放数据库
    CSRFProtect(app)#开始CSRF保护开启
    return app

 

manage

from flask_script import Manager
from flask_migrate import Migrate,MigrateCommand
# from info import app,db
from info import create_app
app = create_app("dev")
manager = Manager(app)#建立脚本管理者
# Migrate(app, db)#创建APP和db的链接
manager.add_command("mysql",MigrateCommand)#创建mysql的脚本命令
@app.route("/")
def index():
    # redis_store.set("name","laoli")
    #测试session
    # session["age"]=28
    return "hello"

if __name__=="__main__":
    manager.run()

 

config

#配置类
from redis import StrictRedis
class Config:
    DEBUG = True
    SQLALCHEMY_DATABASE_URI="mysql://root:mysql@127.0.0.1:3306/two_ti04"
    SQLALCHEMY_TRACK_MODIFICATIONS=False
    REDIS_HOST = "127.0.0.1"
    REDIS_POST = 6379
    SECRET_KEY ="asdsadsada"
    SESSION_TYPE = "redis"#指定用redis来存储session信息
    SESSION_REDIS = StrictRedis(host=REDIS_HOST, port=REDIS_POST)#指定那个redis来存储session信息
    SESSION_USE_SIGNER= True   #设置是否使用秘钥
    SESSION_PERMANENT=60*60*24   #设置cession的储存时间
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
configs={
    "dev":DevelopmentConfig,
    "pro":ProductionConfig,
    "test":TestConfig
}

 

posted on 2021-03-17 12:04  人间不值得啊  阅读(80)  评论(0编辑  收藏  举报