原理如下:

image.png
1、通过调用自定义config.py文件中config字典,可以得到一个类,
这个类里面定义的都是类变量,这些变量就是自定义的一些配置项。
如下config.py : :
import os BASEDIR = os.path.abspath(os.path.dirname(__file__)) class Config: """base config""" SECRET_KEY = os.environ.get('SECRET_KEY') or 'secret key' SQLALCHEMY_COMMIT_ON_TEARDOWN = True SQLALCHEMY_TRACK_MODIFICATIONS = True FLASKY_ADMIN = os.environ.get('FLASKY_ADMIN') FLASKY_MAIL_SENDED = 'jianghan@julanling.com' # 发件人地址 FLASKY_MAIL_SUBJECT_PREFIX = '[Flasky]' # 邮件主题前缀 class ProductionConfig(Config): """运行环境配置""" SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \ 'sqlite:///' + os.path.join(BASEDIR, 'data.sqlite') ...... config = { 'development': DevelopmentConfig, 'testing': ProductionConfig, 'production': ProductionConfig, 'default': DevelopmentConfig }
2、利用Flask类,实例app,并把自定义配置传进去。
如下app.py:
# __name__是本文件名字, # Flask类里面,会根据此名字,找到app.py所在目录,即默认为根目录。 app = Flask(__name__) app.config.from_object(config['testing'])
3、配置原理:
自定义配置类给到app.config。
app.config 来自于 self.make_config()
self.make_config() 返回的值是 config_class()
config_class 就是Config类。
config_class(),是config加个括号,其实就是Config()
通过上面一系列的串联,可以看出:
app.config,就是Config()
之所以要在中间加一些方法,如mke_config(),是为了给Config()添加一些默认值。
例如:根目录root_path、默认配置self.default_config等。
如下:
def make_config(self, instance_relative=False): root_path = self.root_path if instance_relative: root_path = self.instance_path return self.config_class(root_path, self.default_config)
其实,在你在写到app.config时,就已经创建了一个带默认配置项的Config()实例。
Config类有很多方法可以修改默认配置和添加新配置。如from_object()
当写到 app.config.from_object(config),其实就是对默认配置的修改和添加。
参考:很多,在网上了其他人的一些解释,然后自己再看看源码,就大概明白了。
logging模块
flask配置日志
代码
from logging.handlers import RotatingFileHandler from flask import Flask, request import logging app = Flask(__name__) app.config['PROPAGATE_EXCEPTIONS'] = False # 设置是否传递异常 , 如果为True, 则flask运行中的错误会显示到网页中, 如果为False, 则会输出到文件中 class RequestFormatter(logging.Formatter): # 自定义格式化类 def format(self, record): """每次生成日志时都会调用, 该方法主要用于设置自定义的日志信息 :param record 日志信息""" record.url = request.url # 获取请求的url record.remote_addr = request.remote_addr # 获取客户端的ip return super().format(record) # 执行父类的默认操作 # flask中提供了两个日志 1> werkzeug 记录web应用运行中出现的错误 2> flask.app 给开发者预留的日志 # flask中的运行错误也会记录到flask.app的日志中 def create_logger(): """配置flask日志""" # 创建flask.app日志器 flask_logger = logging.getLogger('flask.app') # 设置全局级别 flask_logger.setLevel('DEBUG') # 创建控制台处理器 console_handler = logging.StreamHandler() # 给处理器设置输出格式 console_formatter = logging.Formatter(fmt='%(name)s %(levelname)s %(pathname)s %(lineno)d %(message)s') console_handler.setFormatter(console_formatter) # 日志器添加处理器 flask_logger.addHandler(console_handler) # 创建文件处理器 file_handler = RotatingFileHandler(filename='flask.log', maxBytes=100 * 1024 * 1024, backupCount=10) # 转存文件处理器 当达到限定的文件大小时, 可以将日志转存到其他文件中 # 给处理器设置输出格式 file_formatter = RequestFormatter(fmt='[%(asctime)s] %(remote_addr)s requested %(url)s %(name)s %(levelname)s %(pathname)s %(lineno)d %(message)s') file_handler.setFormatter(file_formatter) # 单独设置文件处理器的日志级别 file_handler.setLevel('WARN') # 日志器添加处理器 flask_logger.addHandler(file_handler) @app.route('/') def index(): # num = 1 / 0 app.logger.error('this is a error') return "index" if __name__ == '__main__': create_logger() app.run(debug=True)
自定义日志信息
项目中配置日志
- 在 家目录中手动创建
log
文件夹
# 查看最新的⽇日志 tail flask.log # 默认查看最新的10⾏行行⽇日志 tail -n 100 flask.log # 默认查看最新的100⾏行行⽇日志 tail -f flask.log # 动态监听⽇日志