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. 上次了解了 ...
随机推荐
- (转载)C# winform 在一个窗体中如何设置另一个窗体的TextBox的值
方法1:修改控件的访问修饰符.(不建议使用此法) public System.Windows.Forms.TextBox textBox1; 在调用时就能直接访问 Form1 frm = new Fo ...
- Redis-Sentinel
Redis-Sentinel是Redis官方推荐的高可用性(HA) 解决方案,Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能 ...
- QLineEdit响应回车时避免Button同时响应
pButton->setAutoDefault(false);
- Javascript 高级程序设计(第3版) - 第01章
2017-05-10 js简介 一个叫“不难登”的人发明的.js的流行是因为 ajax 的关系. js分为三个部分: 核心: ECMAScript 文档对象模型: DOM 浏览器对象模型: BOM 核 ...
- 2、Keepalived提供日志与双主模型演示
Keepalived实例演示: 利用keepalived流动一个VIP,在提供LVS的高可用以及实现对LVS后端的real server做健康状态检测,最后实现高可用nginx. HA Clust ...
- Java 数据库篇
一.简易封装JDBC工具类: package com.jackie.MyBatis.main; import java.sql.Connection; import java.sql.DriverMa ...
- 进度条的制作-python
import time,sys def view_bar(num, total): rate = float(num) / float(total) rate_num = int(rate * 100 ...
- Chrome,你这坑人的默认非安全端口
今天用chrome打开页面的发现一个错误: ERR_UNSAFE_PORT 字面意思是error:不安全端口. 一.什么是默认非安全端口? 每个浏览器出于安全问题,都会禁止一些网络浏览以外的端口 ...
- 【BZOJ】3209: 花神的数论题
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3209 显然是按照二进制位进行DP. 考虑预处理$F[i][j]$表示到了二进制的第$i$位 ...
- Codeforces Round #290 (Div. 2) E. Fox And Dinner 网络流建模
E. Fox And Dinner time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...