上面我们把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 }