zoukankan      html  css  js  c++  java
  • 新闻项目——项目准备——代码抽取

    第一步:配置信息的抽取

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

     

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

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

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

    from config import Config

     第二步:app信息的抽取

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

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

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

     代码:

    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来接收配置信息

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

    return app

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

    第四步:db问题解决

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

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

     我们再接着进入init_app源码

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

     第五步:日志的集成

    首先将日志的代码写入,因为日志的等级比较高,使用我们把它放在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(如果还报错可以在目录那加一个.)

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

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

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

     然后工厂里的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的文件夹来存放它们。

    我们在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
  • 相关阅读:
    STM32关于优先级设定的理解 NVIC_SetPriority()
    linux6.2安装mysql
    【PAT】1009. Product of Polynomials (25)
    Android的重力传感器(3轴加速度传感器)简单实例
    out/target/common/obj/PACKAGING/public_api.txt android.view.KeyEvent.KEYCODE_has changed value from
    框架技术--Spring自动加载配置
    NSDate conversion utilities
    Poj 1201 Intervals
    asp导航条子菜单横向
    大学四年,你必须做的事---这些计算机科学
  • 原文地址:https://www.cnblogs.com/tyl23/p/13762083.html
Copyright © 2011-2022 走看看