• 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
    }
  • 相关阅读:
    Flask 中的路由系统
    Flask 中内置的 Session
    Flask中的模板语言jinja2
    Flask 中的 5种返回值
    Redis快速入门
    动态实现前后台分页、翻页按钮、上一页、下一页、首页、末页
    bus.js非父子组件之间通讯
    vue中父子组件之间相互传值
    js实现加减乘除
    禁用微信分享
  • 原文地址:https://www.cnblogs.com/manjian/p/13758748.html
Copyright © 2020-2023  润新知