python-flask-配置文件的源码分析
方式一: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-配置文件的源码分析的更多相关文章
- Flask系列之源码分析(一)
目录: 涉及知识点 Flask框架原理 简单示例 路由系统原理源码分析 请求流程简单源码分析 响应流程简单源码分析 session简单源码分析 涉及知识点 1.装饰器 闭包思想 def wapper( ...
- flask/app.py-add_url_rule源码分析
之前分析route方法的时候,可以看到中间会调用add_url_rule方法,add_url_rule方法和route方法一样属于Flask这个类的. add_url_rule方法主要用来连接url规 ...
- Flask之wtforms源码分析
一.wtforms源码流程 1.实例化流程分析 # 源码流程 1. 执行type的 __call__ 方法,读取字段到静态字段 cls._unbound_fields 中: meta类读取到cls._ ...
- Flask系列之源码分析(二)
应用技术点 python之__setattr__ python之threading.local python之偏函数 flask源码上下文管理 1.综述过程 将请求对象压入栈 1.请求进入 __cal ...
- Python线程池ThreadPoolExecutor源码分析
在学习concurrent库时遇到了一些问题,后来搞清楚了,这里记录一下 先看个例子: import time from concurrent.futures import ThreadPoolExe ...
- flask请求上下文源码分析
一.什么是上下文 每一段程序都有很多外部变量,只有像add这种简单的函数才是没有外部变量的,一旦你的一段程序有了外部变量,这段程序就不完整了,不能独立运行,你为了使他们能运行,就要给所有的外部变量一个 ...
- python之epoll服务器源码分析
#!/usr/bin/env python # -*- coding: utf8 -*- import socket, select EOL1 = b'/r/n' EOL2 = b'/r/n/r/n' ...
- 基于python的ardrone control源码分析与心得
这里有一段python代码,可用于操控ardrone 2.0.实验室曾经借鉴用过,并添加了部分功能.如今复习一下,顺便理理python的相关知识点. #!/usr/bin/env python # A ...
- Mybatis源码分析之SqlSessionFactory(一)
简介 MyBatis的前身叫iBatis,本是apache的一个开源项目, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBa ...
- Flask源码分析二:路由内部实现原理
前言 Flask是目前为止我最喜欢的一个Python Web框架了,为了更好的掌握其内部实现机制,这两天准备学习下Flask的源码,将由浅入深跟大家分享下,其中Flask版本为1.1.1. 上次了解了 ...
随机推荐
- p2596 书架(Treap)
写平衡树修锅快修到死系列 我太蠢了 其实是平衡树裸体裸题 插入,删除,交换前驱或后继,查询rank和kth 维护一个pos数组,表示第i个书的编号 然后注意许许多多的细节,没了 #include &l ...
- 论文笔记之:Semi-supervised Classification with Graph Convolutional Networks
Semi-supervised Classification with Graph Convolutional Networks 2018-01-16 22:33:36 1. 文章主要思想: 2. ...
- Template 制作模版
直接写在选项里的模板 直接在构造器里的template选项后边编写.这种写法比较直观,但是如果模板html代码太多,不建议这么写. var vm = new Vue({ el:"#app&q ...
- GET和POST中文乱码的解决方法
如果表单中含有中文,采用GET或者POST提交请求时,getParameter()方法接收到的参数值乱码. 1.乱码产生的原因 请求参数通过浏览器发送给Tomcat服务器,浏览器发送编码,但是tomc ...
- 【Net Core】DNX概述
1. 什么是.NET执行环境 ? .NET Execution Environment(DNX) 是一个SDK 和运行时环境,它包含所有的你需要创建和运行.net应用程序的组件.它提供一个主机进程,C ...
- PHP中cookie思维导图
- 后台返回数据判断是http还是后台本地图片 indexOf
今天的笔记呢,记录一下 其实这个应该后台去判断的,但是因为某种原因,今天我们前台做一下判断 事情是这样的,后台返回我一个url 这个url有的http开头的 也有他后台本地的例如:/img/1.pn ...
- Cannot set property 'onclick' of null的问题
转载自: https://my.oschina.net/ximidao/blog/351017 摘要: 测试点击事件的时候浏览器报错,提示Uncaught TypeError: Cannot set ...
- SqlServer 中的触发器
SqlServer 触发器实现多表之间同步增加.删除与更新 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程. ...
- python with as 的用法
with语句: 不管是否发生异常都会指执行必要的清理操作,比如文件的自动关闭以及线程中锁的自动获取与释放. 比如文件处理,需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄 不用with语句,代 ...