方式一:app.config['xx'] = 'xxx'
源码分析:
#第1步:
class Flask(_PackageBoundObject):
    self.config = self.make_config(instance_relative_config)
    #第2步:
    def make_config(self, instance_relative=False):
        return self.config_class(root_path, self.default_config)
        #self.config_class = Config
    #第3步:
   class Config(dict):
  发现app.config是一个dict类/派生类的对象,那么app.config 就可以app.config['xx'] = 'xxx' 设置值,内部是实现了__setitem__方法
方式二:app.config.from_pyfile('settings.py')
源码分析:
class Config(dict):
def from_pyfile(self, filename, silent=False):
#找到文件
filename = os.path.join(self.root_path, filename)
#创建了一个模块,里面没有东西
d = types.ModuleType('config')
d.__file__ = filename
try:
#打开文件,获取所有内容
#再将配置文件里的所有值封装到上一步创建的模块中
with open(filename, mode='rb') as config_file:
exec(compile(config_file.read(), filename, 'exec'), d.__dict__)
#执行from_object方法
self.from_object(d)
return True def from_object(self, obj):
#获取创建的模块中的所有值,如果是大写,给app.config设置值
for key in dir(obj):
if key.isupper():
self[key] = getattr(obj, key)
方式三:
os.environ['FLAKS-SETTINGS'] = 'settings.py'
app.config.from_envvar('FLAKS-SETTINGS')
源码分析:
class Config(dict):
    def from_envvar(self, variable_name, silent=False):
     #获取settings文件
        rv = os.environ.get(variable_name)
     #发现还是执行了from_pyfile方法
        return self.from_pyfile(rv, silent=silent)
方式四:
app.config.from_object('settings.DevConfig')
源码分析:
class Config(dict):
    def from_object(self, obj):
     #4.1如果settings.DevConfig 是字符串类/派生类的对象
        if isinstance(obj, string_types):
       #4.2
            obj = import_string(obj)
     #4.3步 获取类中的所有值,并给app.config设置值
     for key in dir(obj):
            if key.isupper():
            self[key] = getattr(obj, key) #4.2步:
def import_string(import_name, silent=False):
     #把settings.DevConfig按照.右切1次,得到模块名和类名
        module_name, obj_name = import_name.rsplit('.', 1)
        try:
            module = __import__(module_name, None, None, [obj_name])
        #获取模块中的类并返回
        try:
            return getattr(module, obj_name)

python-flask-配置文件的源码分析的更多相关文章

  1. Flask系列之源码分析(一)

    目录: 涉及知识点 Flask框架原理 简单示例 路由系统原理源码分析 请求流程简单源码分析 响应流程简单源码分析 session简单源码分析 涉及知识点 1.装饰器 闭包思想 def wapper( ...

  2. flask/app.py-add_url_rule源码分析

    之前分析route方法的时候,可以看到中间会调用add_url_rule方法,add_url_rule方法和route方法一样属于Flask这个类的. add_url_rule方法主要用来连接url规 ...

  3. Flask之wtforms源码分析

    一.wtforms源码流程 1.实例化流程分析 # 源码流程 1. 执行type的 __call__ 方法,读取字段到静态字段 cls._unbound_fields 中: meta类读取到cls._ ...

  4. Flask系列之源码分析(二)

    应用技术点 python之__setattr__ python之threading.local python之偏函数 flask源码上下文管理 1.综述过程 将请求对象压入栈 1.请求进入 __cal ...

  5. Python线程池ThreadPoolExecutor源码分析

    在学习concurrent库时遇到了一些问题,后来搞清楚了,这里记录一下 先看个例子: import time from concurrent.futures import ThreadPoolExe ...

  6. flask请求上下文源码分析

    一.什么是上下文 每一段程序都有很多外部变量,只有像add这种简单的函数才是没有外部变量的,一旦你的一段程序有了外部变量,这段程序就不完整了,不能独立运行,你为了使他们能运行,就要给所有的外部变量一个 ...

  7. python之epoll服务器源码分析

    #!/usr/bin/env python # -*- coding: utf8 -*- import socket, select EOL1 = b'/r/n' EOL2 = b'/r/n/r/n' ...

  8. 基于python的ardrone control源码分析与心得

    这里有一段python代码,可用于操控ardrone 2.0.实验室曾经借鉴用过,并添加了部分功能.如今复习一下,顺便理理python的相关知识点. #!/usr/bin/env python # A ...

  9. Mybatis源码分析之SqlSessionFactory(一)

    简介 MyBatis的前身叫iBatis,本是apache的一个开源项目, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBa ...

  10. Flask源码分析二:路由内部实现原理

    前言 Flask是目前为止我最喜欢的一个Python Web框架了,为了更好的掌握其内部实现机制,这两天准备学习下Flask的源码,将由浅入深跟大家分享下,其中Flask版本为1.1.1. 上次了解了 ...

随机推荐

  1. Tutorial: Generate BBox or Rectangle to locate the target obejct

    Tutorial: Generate BBox or Rectangle to locate the target obejct clc;close all;clear all; Img=imread ...

  2. java根据URL获取HTML内容

    之前我写脚本,是想获取HTML内容的. 但是呢...一方面编码困扰着我,于是我写了这个: java根据URL获取网页编码 然后呢,每个网站是不是GZIP还得判断,贼麻烦... 但是没办法啊,麻烦也得写 ...

  3. JavaScript中的方法事件和函数的方法的三种方法

    js中的很多事件  而事件相对应的就是方法(函数 )那么今天所说的就是这三种方法      已onclick事件为例 1: 基本方法 <div id="a" onclick= ...

  4. 安装logstash和logstash-input-jdbc

    一.安装logstash 1.mac 下直接 brew install logstash 二.安装logstash-input-jdbc 直接在logstash的安装目录bin下运行 ./logsta ...

  5. Python使用win32com实现的模拟浏览器功能

    # -*- coding:UTF- -*- #!/user/bin/env python ''' Created on -- @author: chenzehe ''' import win32com ...

  6. Pandas——ix 与 loc 与 iloc 与 icol 的区别

    来自:https://blog.csdn.net/xw_classmate/article/details/51333646 来自:https://blog.csdn.net/chenKFKevin/ ...

  7. Event(事件)

    1.ZC:之前一直没怎么用过 OpenEvent(...),这次试用居然老是报错... 弄了一下,貌似是 OpenEvent(...)的第一个参数设置成0了... FhEvent_Communicat ...

  8. Utunbu常见问题

    关于Ubuntu中Could not get lock /var/lib/dpkg/lock解决方案 https://blog.csdn.net/u011596455/article/details/ ...

  9. 虚拟机安装---vm12+ubuntukylin16.04

    虚拟机安装及部分问题解决方案: https://blog.csdn.net/qq_35208390/article/details/78271743 安装vmware tools后,需设置共享文件夹才 ...

  10. 关于js函数,方法,对象实例的一些说明

    朋友们大家好,好久没有更新文章了,最近正好有空就想着写点什么吧,加上这段时间总是能听到一些朋友们问关于js函数,方法,对象实例到底有什么区别这个问题,所以今天就献丑来简单说明一些吧! 其实这些主要都是 ...