写在前面的话:
Flask 是 python 技术栈中比较受欢迎的 web 框架之一,Github star 数量 5w+,源码系列分析 2.0.1 版本的构建逻辑和值得借鉴的代码思路。
目录结构
# 中划线"-"开头的是目录
# 有后缀名的是文件,一般是 .py 文件类型
-flask
-json
__init.py
tag.py
__init__.py
__main__.py
...
项目下只有 json
一个文件目录,其他文件都是平铺在一级目录下的。
__init__.py
将一个文件目录作为 package 处理,命令 python flask
优先执行此文件;__main__.py
将一个文件目录作为 package 执行,命令 python -m flask
优先执行此文件,-m
是以 module 方式启动。
上面的 flask 没有复杂的内容,只是前面目录结构中的 flask 文件目录,执行的逻辑是 python 实现的。
python package
参考官网说明。
-
好的习惯:在 python 的包管理中保持创建
__init__.py
,这会提高 python 在用.
寻找资源时候的效率,例如flask.json
会从flask
文件目录的__init__.py
寻找json
模块。 -
好的习惯:在
__init__.py
中写明__all__
,清楚的管理 package 想要对外暴露的资源以及名称,避免因为 python 自动寻找解析资源引发的隐晦问题。
二方包启动
上文 python flask
和 python -m flask
有什么区别?
python 执行都是从 sys.path
开始查找资源
-
python flask
包运行
查找flask
文件目录下的主 module,在 python 中的定义
是__main__.py
文件,__package__
是空字符串 -
python -m flask
模块运行
以模块的方式执行,查找flask
文件目录下的__init__.py
,执行后再执行__main__.py
,__package__
是flask
,即包的名字
所以,一般会在 __init__.py
中定义入口函数 main()
,这样包运行会进入 main 方法,模块运行在 __init__.py
执行 main 方法,能够统一入口。
flask 的入口
__init__.py
from markupsafe import escape
from markupsafe import Markup
from werkzeug.exceptions import abort as abort
from werkzeug.utils import redirect as redirect
from . import json as json
from .app import Flask as Flask
from .app import Request as Request
...
__version__ = "2.0.1"
引入了 markupsafe
和 werkzeug
的三方依赖,其余项目资源都用相对路径方式引入,提供更好的二方包管理,避免因为路径造成的资源引用错误。同时外部引用的时候,即 from flask import xxx
可以方便 python 第一时间找到对应资源,另外给出了二方包的版本信息。
外部可以通过 flask --version
来查看安装的二方包版本。
__main__.py
from .cli import main
main()
统一了项目入口,包启动的时候直接执行 __main__.py
,模块启动的时候执行 __init__.py
没有项目启动相关逻辑,再次执行 __main__.py
的时候进入到命令行启动的入口函数 main()
Take Away points
综上,flask
项目给出了非常值得借鉴的二方包入口管理思路。
- 项目目录结构尽量扁平化;
-
__init__.py
管理所有对外暴露的资源,不做启动逻辑; -
__main__.py
统一项目入口,包启动和模块启动都引导到命令行启动的主程序入口main()
网友评论