美文网首页源码分析
Flask 源码(1)

Flask 源码(1)

作者: Sisyphus235 | 来源:发表于2021-09-25 14:15 被阅读0次

    写在前面的话:
    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 flaskpython -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"
    

    引入了 markupsafewerkzeug 的三方依赖,其余项目资源都用相对路径方式引入,提供更好的二方包管理,避免因为路径造成的资源引用错误。同时外部引用的时候,即 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 项目给出了非常值得借鉴的二方包入口管理思路。

    1. 项目目录结构尽量扁平化;
    2. __init__.py 管理所有对外暴露的资源,不做启动逻辑;
    3. __main__.py 统一项目入口,包启动和模块启动都引导到命令行启动的主程序入口 main()

    相关文章

      网友评论

        本文标题:Flask 源码(1)

        本文链接:https://www.haomeiwen.com/subject/ctsxnltx.html