目录结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| Flask-
|- artwork/ #证书和logo
|- AUTHORS #作者
|- CHANGES #更新
|- CONTRIBUTING.rst #贡献
|- docs/ #文档
|- examples/ #例子,方便快速入门
|- scripts/ #一些脚本
|- flask/ #要读的代码 |- __init__.py |- __main__.py |- _compat.py |- app.py #主体: Flask,Request,Response |- blueprints.py #blueprint,蓝图 |- cli.py D |- config.py #项目配置文件的处理逻辑 |- ctx.py #上下文处理的一些方法 |- debughelpers.py |- exthook.py D |- globals.py #全局变量 |- helpers.py #一些辅助方法的实现 |- json.py #json相关 |- logging.py |- sessions.py |- signals.py |- templating.py #模板渲染相关 |- testsuite/ #测试 |- views.py |- wrappers.py |- ext/ #扩展
|
以下以阅读顺序列出一些笔记
建议先去看werkzeug源码,依赖很多
init.py
init.py
将所有变量从对应模块中import进来放到这里,然后可以直接通过
1 2 3
| from flask import XXXX
|
方便处理
项目依赖于
config.py
config.py
定义了两个对象
1 2 3 4 5
| ConfigAttribute(object) #转换attr到配置
Config(dict) #具体配置对象,可以通过三种方式给Config加配置
|
Config的三个方法
1 2 3 4 5 6 7 8 9
| def from_envvar(self, variable_name, silent=False)
def from_pyfile(self, filename, silent=False) #文件,会将文件转为模块对象
def from_object(self, obj) #模块对象
注意:只读大写开头的
|
这里定义了三种方法,所以你可以通过三种不同的方式初始化flask配置
1.从文件
1 2 3
| app.config.from_pyfile('yourconfig.cfg')
|
2.从模块对象
1 2 3 4 5 6 7
| DEBUG = True
SECRET_KEY = 'development key'
app.config.from_object(__name__)
|
3.从环境变量
1 2 3 4 5
| shell: export YOURAPPLICATION_SETTINGS='/path/to/config/file'
app.config.from_envvar('YOURAPPLICATION_SETTINGS')
|
扩展
1.
1 2 3 4 5 6 7 8
| import imp
d = imp.new_module('config')
with open(filename) as config_file: exec(compile(config_file.read(), filename, 'exec'), d.__dict__)
|
2.
1 2 3 4 5 6
| import errno
except IOError as e: if silent and e.errno in (errno.ENOENT, errno.EISDIR)
|
3.继承父类的init方法
1 2 3 4
| def __init__(self, root_path, defaults=None): dict.__init__(self, defaults or {})
|
4.
1 2 3 4 5 6
| from werkzeug.utils import import_string
if isinstance(obj, string_types): obj = import_string(obj)
|
globals.py
globals.py
定义了全局变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| from werkzeug.local import LocalStack, LocalProxy
_request_ctx_stack = LocalStack() #request上下文
_app_ctx_stack = LocalStack() #app上下文
current_app = LocalProxy(_find_app) #当前app, 从 _app_ctx_stack捞
request = LocalProxy(partial(_lookup_req_object, 'request')) #request对象,从_request_ctx_stack捞
session = LocalProxy(partial(_lookup_req_object, 'session')) #session对象,从_request_ctx_stack捞
g = LocalProxy(partial(_lookup_app_object, 'g')) #g对象, 从 _app_ctx_stack捞
|
扩展
1.
1 2 3 4 5
| from functools import partial
session = LocalProxy(partial(_lookup_req_object, 'session')) #session对象,从_request_ctx_stack捞
|
2.
1 2 3 4
| if top is None: raise RuntimeError('working outside of application context')
|
3.
1 2 3
| from werkzeug.local import LocalStack, LocalProxy
|
The Why·Liam·Blog by WhyLiam is licensed under a Creative Commons BY-NC-ND 4.0 International License.
由WhyLiam创作并维护的Why·Liam·Blog采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。
本文首发于Why·Liam·Blog (https://blog.naaln.com),版权所有,侵权必究。
本文永久链接:https://blog.naaln.com/2016/05/flask-source-read-the-comments-the-directory-structure/