Inside Flask - app.py - 1

除 werkzeug 和 jinja2 等依赖库外,app.py 是在 Flask 的 __init__.py 中导入的第一个 Flask 自身的模块。 app.py 的注释中已明确说明这个模块的作用:

flask.app
~~~~~~~~~ This module implements the central WSGI application object.

依赖分析

在这个模块中,导入了 Flask 中的其它工具模块,并组合起来实现所需的功能,包括:

  1. 内置模块

    app.py 导入了以下的内置模块

     import os
    import sys
    from threading import Lock
    from datetime import timedelta
    from itertools import chain
    from functools import update_wrapper

    线程锁 Lock 用在日志初始化(行 40 ,579)和第一次请求时回调用已注册在 before_first_request_funcs 的函数(行 499 ,1492)

    timedelta 用来处理 Flask 中和时间相关的配置信息(行 220),一般以秒为单位。

    chain 处理可迭代变量,如多个函数列表的合并等(行 713)。

    update_wrapper 是个函数装饰器工具,让函数看起来过像是原来的函数,可跳转到代码看看它的实现。

  2. 依赖库模块

    从 werkzeug 导入了一些简单的类工具

     from werkzeug.datastructures import ImmutableDict
    from werkzeug.routing import Map, Rule, RequestRedirect, BuildError
    from werkzeug.exceptions import HTTPException, InternalServerError, \
    MethodNotAllowed, BadRequest

    后面在涉及到代码时再分析。

  3. Flask 其它工具模块

    基本上把其它的工具模块都导了进来,并整合到 Flask 类中,这些后面涉及到时再分析。

代码分析

这个模块中包含 _make_timedelta setupmethod Flask 3 个 object。

  1. _make_timedelta

    这只是一个简单的工具函数,把数字当作秒数,并转换为 datetime.timedelta

  2. setupmethod

    它是个装饰器,用来标记一个函数是 setup 函数。为了提高代码的规范性,它要求被装饰的函数,如 register_blueprint 等,只允许未有任务请求前调用。在 debug 状态下,如果已经有 URL 被请求过,此时再执行这类函数,就会抛出异常。

    它的作用在于,提示开发者,别做出在类似于在飞机飞行途中更换引擎的危险行为。但是如果非要这样做,那么它也没有阻止你,在非 debug 下调用这类 setup 函数并不会抛出异常,但记住,后果自负。

  3. Flask

    Flask 类可能是 Flask 里面最大最复杂的类。 Flask 类的代码从 66 行到 1842 行,一共 1776 行。整个 Flask 的源代码才 5374 行,而 Flask 类已经占了 1/3 !

    但不要担心,在去掉了注释和 docstring 后,统计出来的代码并不多,只有 794 行!! ::

     sed -e '/^[[:space:]]*#/d' -e '/""".*"""/d' \
    -e '/"""/,/"""/d' app.py | wc -l

    真让人激动,这 794 行的代码里隐藏着怎样的秘密

    Flask 类里面的方法较多,大体上分成几类:

    1. 配置处理
    2. 模板处理
    3. 会话管理
    4. 路由
    5. blueprint 扩展
    6. 回调函数管理
    7. 上下文管理
    8. 错误和异常处理
    9. wsgi 和请求分发
    10. 测试支持

    后续逐个分析相关的功能的设计。

Inside Flask - app.py - 1的更多相关文章

  1. Inside Flask - app.py - 2

    Inside Flask - app.py - 2 Flask 初始化参数 Flass 类是 Flask 框架的核心,一个 flask 对象处理视图函数注册.URL规则.模板配置.参数设置等等. 一般 ...

  2. Flask源码阅读-第四篇(flask\app.py)

    flask.app该模块2000多行代码,主要完成应用的配置.初始化.蓝图注册.请求装饰器定义.应用的启动和监听,其中以下方法可以重点品读和关注 def setupmethod(f): @setupm ...

  3. Inside Flask - 配置的实现

    Inside Flask - 配置的实现 flask 的配置对象 app.config 本身使用很简单,无非就是以字典的形式使用,而它的实现,本身就是以字典的形式的. 在 flask/config.p ...

  4. Inside Flask - globals 全局变量(对象代理)

    Inside Flask - globals 全局变量(对象代理) 框架是一个容器,在框架内编程,一般是要遵守框架的约定和使用模式.通常这样的模式是 IoC,即由框架调用用户的代码,而不是用户调用框架 ...

  5. Inside Flask - flask.__init__.py 和核心组件

    Inside Flask - flask.__init__.py 和核心组件 简单的示例 首先看看一个简单的示例.使用 Flask ,通常是从 flask 模块导入 Flask . request 等 ...

  6. Flask - app.debug=True,python manage.py和export FLASK_DEBUG=True,flask run的不同。

    TL;DR,可以直接看下面的总结 问题1:为什么app.config['DEBUG'] = True,然后flask run并没有开启debugger和reloading,而直接运行脚本(python ...

  7. Inside Flask - json 处理

    Inside Flask - json 处理 在处理 web api 时,json 是非常好用的数据交换格式,它结构简单,基本上各种主流的编程语言都有良好的支持工具. flask 中处理 json 时 ...

  8. Inside Flask - signal 信号机制

    Inside Flask - signal 信号机制 singal 在平常的 flask web 开发过程中较少接触到,但对于使用 flask 进行框架级别的开发时,则必须了解相关的工作机制.flas ...

  9. Inside Flask - flask 扩展加载过程

    Inside Flask - flask 扩展加载过程 flask 扩展(插件)通常是以 flask_<扩展名字> 为扩展的 python 包名,而使用时,可用 import flask. ...

随机推荐

  1. android开发事件监听

    第一种:匿名内部类作为事件监听器类 大部分时候,事件处理器都没有什么利用价值(可利用代码通常都被抽象成了业务逻辑方法),因此大部分事件监听器只是临时使用一次,所以使用匿名内部类形式的事件监听器更合适, ...

  2. 零宽度正预测先行断言是什么呢,看msdn上的官方解释定义

    最近为了对html文件进行源码处理,需要进行正则查找并替换.于是借着这个机会把正则系统地学一下,虽然以前也用过正则,但每次都是临时学一下混过关的.在学习的过程中还是遇到不少问题的,特别是零宽断言(这里 ...

  3. easyui datagrid 列隐藏和显示

    easyui datagrid 列隐藏和显示 用js怎么控制列的显示和隐藏?   最佳答案   $('#grid').datagrid('hideColumn','列field');把hideColu ...

  4. The P4 Language Specification v1.0.2 Parser

    <p4规范>解析器部分详解 p4解析器是根据有限状态机的思想来设计的. 解析器中解析的过程可以被一个解析图(parser graph)所表示,解析图中所表示的某一个状态(或者说,在P4语言 ...

  5. Web 在线文件管理器学习笔记与总结(9)下载文件

    ① 普通形式的文件可以使用超链接形式下载 <a href = '下载文件名'>点击下载</a> ② 如果下载图片.html 等类型的文件,使用header() 函数发送网页头信 ...

  6. [SHELL进阶] (转)最牛B的 Linux Shell 命令 (二)

    1.用你最喜欢的编辑器来敲命令 command <CTRL-x CTRL-e> 在已经敲完的命令后按 <CTRL-x CTRL-e> ,会打开一个你指定的编辑器(比如vim,通 ...

  7. 总结android项目的基本开发步骤(转帖)

    总结android项目的基本开发步骤(转帖)   做了几个android企业应用项目后,总结了项目的基本开发步骤,希望能够交流.一 应用规划:    ※确定功能.    ※必须的界面及界面跳转的流程. ...

  8. 7.PHP内核探索:Apache模块介绍

    Apache概述 Apache是目前世界上使用最为广泛的一种Web Server,它以跨平台.高效和稳定而闻名.按照去年官方统计的数据,Apache服务器的装机量占该市场60%以上的份额.尤其是在 X ...

  9. 打造私有的DNS 服务

    在企业内部一般都会有自己的DNS服务,主要为了企业方便管理,例如访问一些内部系统,控制一些网站不让访问,今天我们就说说如何打造私有的DNS服务 系统基础配置 Ubuntu14.04  内存:354M ...

  10. Windows 一键安装OpenSSL

    原理:OpenSSL在github上有开源项目,我们只需要把代码克隆到本地,在本地编译一下就好了 注意事项: 1->在github上获取源码,必须要安装git for windows,网址 ht ...