美文网首页
2020-06-16--flask项目02---基本配置1

2020-06-16--flask项目02---基本配置1

作者: program_white | 来源:发表于2020-06-16 21:51 被阅读0次
    • 创建app函数和日志的设置
    • 蓝图
    • 项目执行流程

    创建app函数和日志的设置

    1.在Config类中加一个日志级别设置:

     '''日志级别'''
        LEVEL = logging.DEBUG
    

    这相当于默认级别。
    在下边的三个模式类中可以重写这个LEVEL变量。
    例如:
    ProductConfig类:

    #生产环境
    class ProductConfig(Config):
        DEBUG = False
        LEVEL = logging.ERROR    #覆盖父类中的LEVEL
    

    2.在news_info/init.py中编写函数
    create_app():

    '''创建app的方法'''
    def create_app(config_name):
        '''通过传入不同的配置名,切换不同的环境'''
         
        app = Flask(__name__)  # 获取app实例
    
        # 根据传进来的config_name以字典方式获取对应的类
        config = config_dict.get(config_name)
        # 关联config类中的配置
        app.config.from_object(config)  
        # 根据config类中的LEVEL设置日志级别,由于继承父类Config,默认为DEBUG
        log_file(config.LEVEL)
    
        # 初始化redis配置
        redis.StrictRedis(host=Config.RDIES_HOST,port=Config.RDIES_PORT)
    
        # 开启csrf保护,只用于服务器验 证
        CSRFProtect(app)
    
        # 设置session保存位置
        Session(app)
    
        return app
    

    log_file():

    '''记录日志'''
    def log_file(level):
        '''根据传进来的level进行操作'''
        # 设置日志的记录等级,常见等级有: DEBUG<INFO<WARING<ERROR
        logging.basicConfig(level=level)  # 调试debug级
    
        # 创建日志记录器,指明日志保存的路径、每个日志文件的最大大小、保存的日志文件个数上限
        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)
    

    写到这时,manage.py中会报出app,db的错误,因为manage.py中有用到init中的内容。

    3.修改manage.py,由于我们在init.py中写了创建app的函数,那么直接将函数导进来,在manage.py中创建即可。

    1.导入函数和db
    from newsInfo import app,db
    更换为
    from newsInfo import create_app,db
    
    2。调用函数,创建app
    app = create_app('develop')
    

    4.新建logs目录。
    运行:



    在logs文件下生成了log日志文件:



    提交github时,不要把log日志文件提交上去,
    修改方法:
    在.gitignore文件中加上:
    logs/*
    

    这时在GitHub Desktop上就没有了logs了


    蓝图

    存在问题

    我们学习Flask框架,是从写单个文件,执行hello world开始的。我们在这单个文件中可以定义路由、视图函数、定义模型等等。但这显然存在一个问题:随着业务代码的增加,将所有代码都放在单个程序文件中,是非常不合适的。这不仅会让代码阅读变得困难,而且会给后期维护带来麻烦,我们在一个文件中写入多个路由,这会使代码维护变得困难。

    一个程序执行文件中,功能代码过多。就是让代码模块化。根据具体不同功能模块的实现,划分成不同的分类,降低各功能模块之间的耦合度。python中的模块制作和导入就是基于实现功能模块的封装的需求。

    尝试用模块导入的方式解决: 我们把上述一个py文件的多个路由视图函数给拆成两个文件:app.py和admin.py文件。app.py文件作为程序启动文件,因为admin文件没有应用程序实例app,在admin文件中要使用app.route路由装饰器,需要把app.py文件的app导入到admin.py文件中。
    上述的方法是不可取的。在python中切记不要互相导入。

    也就是说,flask中提供一种能使代码更模块化,分层化的一个东西--蓝图,在之前的django中本身就已经将各个模块分开了,每一个模块负责网站的一块内容。

    什么是蓝图?

    蓝图:用于实现单个应用的视图、模板、静态文件的集合。

    蓝图就是模块化处理的类。

    简单来说,蓝图就是一个存储操作路由映射方法的容器,主要用来实现客户端请求和URL相互关联的功能。 在Flask中,使用蓝图可以帮助我们实现模块化应用的功能。

    蓝图的运行机制:

    蓝图是保存了一组将来可以在应用对象上执行的操作。注册路由就是一种操作,当在程序实例上调用route装饰器注册路由时,这个操作将修改对象的url_map路由映射列表。当我们在蓝图对象上调用route装饰器注册路由时,它只是在内部的一个延迟操作记录列表defered_functions中添加了一个项。当执行应用对象的 register_blueprint() 方法时,应用对象从蓝图对象的 defered_functions 列表中取出每一项,即调用应用对象的 add_url_rule() 方法,这将会修改程序实例的路由映射列表。

    蓝图的使用

    1.导入蓝图

    from flask import Blueprint
    

    2.创建蓝图对象

    #创建蓝图对象
    name:蓝图的名称,import_name:获取当前模块
    users = Blueprint(name='user',import_name=__name__)
    

    3.注册蓝图路由,也就是在该模块中的视图函数

    @users.route('/user1')
    def user():
        return '/user/user1'
    

    4.将每个模块的蓝图对象注册到程序的入口文件中
    首先要导入蓝图对象,blueprint:蓝图对象,url_prefix:该蓝图的起始url地址(类似于django中某个模块的总url)

    app.register_blueprint(blueprint=users,url_prefix = '/user')
    

    实例:
    程序入口:
    test.py:

    from flask import Flask
    from user import users           #导入蓝图对象
    from admin import admins
    
    
    app = Flask(__name__)
    
    #注册蓝图
    app.register_blueprint(blueprint=users,url_prefix = '/user')
    app.register_blueprint(blueprint=admins,url_prefix = '/admin')
    
    @app.route('/')
    def hello_world():
        return 'Hello World!'
    
    if __name__ == '__main__':
        app.run()
    

    user.py:

    from flask import Blueprint
    
    
    #创建蓝图
    users = Blueprint(name='use',import_name=__name__)
    
    #注册蓝图路由
    @users.route('/user1')
    def user():
        return '/user/user1'
    

    admin.py:

    from flask import Blueprint
    
    
    #创建蓝图
    admins = Blueprint(name='admin',import_name=__name__)
    
    @admins.route('/admin1')
    def admin():
        return '/admin/admin1'
    

    运行:



    注意:在使用蓝图时有可能会报出如下错误:



    这是由于某个蓝图中的视图函数名于flask中相冲突,修改为其他的名称即可。

    项目中的蓝图

    在实际项目开发中,蓝图的使用没有在demo中的那么简单,因为项目的分层相对清晰,包之间层层嵌套。

    在项目中蓝图的使用步骤:

    1.在整个项目的app包(newsInfo)新建package--modelus,modelus负责整个项目的某个模块的操作。
    2.在modelus模块中新建index包,负责首页的展示部分。在index包下新建views.py文件,
    具体的包目录如下:



    3.在index包下

    • init.py:该index包下操作的初始化,也就是负责蓝图的创建
    • views.py:负责init下蓝图视图函数的编写

    index/init.py:

    from flask import Blueprint
    
    #创建蓝图
    index_blue = Blueprint('index',__name__)
    
    #导入本包下的views
    from . import views 
    

    index/views.py:

    #视图
    
    from . import index_blue      #导入__init__.py下的蓝图对象index_blue
    
    #为该蓝图编写视图函数
    @index_blue.route('/index1')
    def index():
        return '/index/index1'
    

    4.在app实例下注册蓝图
    也就是创建app时,就把所创建的蓝图加进去
    这应该加在create_app函数中;

        #在创建app时注册蓝图,尽量把导入和注册写在一起
        from newsInfo.modules.index import index_blue
        app.register_blueprint(index_blue,url_prefix = '/index')
    

    注意:在创建app时注册蓝图,尽量把导入和注册写在一起

    运行:


    蓝图在项目执行的流程

    在了解蓝图之后首先要了解整个项目以及app管理包(newsInfo)的目录结构和运行流程:
    1.接下来走newsInfo包,因为app = Flask(name)在init.py下,先进入init初始化:
    创建app的函数:获取app实例,关联Config配置,开启csrf保护,设置session,日志调用等操作。还有编写日志函数。
    2.首先项目最先走的时manage.py中:
    在这里执行的是调用创建app对象的函数创建app,管理app-manager,以及数据库的迁移。

    3.在进入下一个模块index,首先进入init.py下:创建蓝图,根据蓝图对象在views.py中寻找该蓝图的视图函数。

    相关文章

      网友评论

          本文标题:2020-06-16--flask项目02---基本配置1

          本文链接:https://www.haomeiwen.com/subject/htzrxktx.html