Inside Flask - app.py - 1
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 中的其它工具模块,并组合起来实现所需的功能,包括:
内置模块
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 是个函数装饰器工具,让函数看起来过像是原来的函数,可跳转到代码看看它的实现。
依赖库模块
从 werkzeug 导入了一些简单的类工具
from werkzeug.datastructures import ImmutableDict
from werkzeug.routing import Map, Rule, RequestRedirect, BuildError
from werkzeug.exceptions import HTTPException, InternalServerError, \
MethodNotAllowed, BadRequest
后面在涉及到代码时再分析。
Flask 其它工具模块
基本上把其它的工具模块都导了进来,并整合到 Flask 类中,这些后面涉及到时再分析。
代码分析
这个模块中包含 _make_timedelta setupmethod Flask 3 个 object。
_make_timedelta这只是一个简单的工具函数,把数字当作秒数,并转换为
datetime.timedelta。setupmethod它是个装饰器,用来标记一个函数是 setup 函数。为了提高代码的规范性,它要求被装饰的函数,如 register_blueprint 等,只允许未有任务请求前调用。在 debug 状态下,如果已经有 URL 被请求过,此时再执行这类函数,就会抛出异常。
它的作用在于,提示开发者,别做出在类似于在飞机飞行途中更换引擎的危险行为。但是如果非要这样做,那么它也没有阻止你,在非 debug 下调用这类 setup 函数并不会抛出异常,但记住,后果自负。
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类里面的方法较多,大体上分成几类:- 配置处理
- 模板处理
- 会话管理
- 路由
- blueprint 扩展
- 回调函数管理
- 上下文管理
- 错误和异常处理
- wsgi 和请求分发
- 测试支持
后续逐个分析相关的功能的设计。
Inside Flask - app.py - 1的更多相关文章
- Inside Flask - app.py - 2
Inside Flask - app.py - 2 Flask 初始化参数 Flass 类是 Flask 框架的核心,一个 flask 对象处理视图函数注册.URL规则.模板配置.参数设置等等. 一般 ...
- Flask源码阅读-第四篇(flask\app.py)
flask.app该模块2000多行代码,主要完成应用的配置.初始化.蓝图注册.请求装饰器定义.应用的启动和监听,其中以下方法可以重点品读和关注 def setupmethod(f): @setupm ...
- Inside Flask - 配置的实现
Inside Flask - 配置的实现 flask 的配置对象 app.config 本身使用很简单,无非就是以字典的形式使用,而它的实现,本身就是以字典的形式的. 在 flask/config.p ...
- Inside Flask - globals 全局变量(对象代理)
Inside Flask - globals 全局变量(对象代理) 框架是一个容器,在框架内编程,一般是要遵守框架的约定和使用模式.通常这样的模式是 IoC,即由框架调用用户的代码,而不是用户调用框架 ...
- Inside Flask - flask.__init__.py 和核心组件
Inside Flask - flask.__init__.py 和核心组件 简单的示例 首先看看一个简单的示例.使用 Flask ,通常是从 flask 模块导入 Flask . request 等 ...
- 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 ...
- Inside Flask - json 处理
Inside Flask - json 处理 在处理 web api 时,json 是非常好用的数据交换格式,它结构简单,基本上各种主流的编程语言都有良好的支持工具. flask 中处理 json 时 ...
- Inside Flask - signal 信号机制
Inside Flask - signal 信号机制 singal 在平常的 flask web 开发过程中较少接触到,但对于使用 flask 进行框架级别的开发时,则必须了解相关的工作机制.flas ...
- Inside Flask - flask 扩展加载过程
Inside Flask - flask 扩展加载过程 flask 扩展(插件)通常是以 flask_<扩展名字> 为扩展的 python 包名,而使用时,可用 import flask. ...
随机推荐
- 提取数据用strpos函数比较,预期和实际不符问题解决
在我提取数据时,数据是一串字符串,第一个数据和要比较的字符是相等的可是却是相反的结果 . 测试if(0==false)结果如图 执行结果 说明0和false相等.我的程序开始是这样的 第一个数据是正确 ...
- 那些年我们没能bypass的xss filter
个人很喜欢收集xss payload.在这里把自己平时挖xss时会用到的payloads列出来和大家一起分享.很希望大家能把自己的一些payload也分享出来.(由于 我是linux党,所以本文出现在 ...
- 第五次实验报告 java 网络编程
20145306 第五次 java 实验报告 实验内容 客户端与服务器连接,客户端中输入明文,利用DES算法加密,DES的秘钥用RSA公钥密码中服务器的公钥加密,计算明文的Hash函数值,一起传送给客 ...
- SqlParameter 基本用法
因为通过SQL 语句的方式,有时候存在脚本注入的危险,所以在大多数情况下不建议用拼接SQL语句字符串方式,希望通过SqlParameter实现来实现对数据的操 作,针对SqlParameter的方式我 ...
- 【iCore2双核心板视频教程】 AD模块(iM_AD_GP和iM_AD_SYNC)介绍及数据采集实验三
建议设定成 “超清” 模式并 “全屏” 观看. ============================== 技术论坛:http://www.eeschool.org 博客地址:http://xiao ...
- Ubuntu下搭建NodeJS+Express WEB开发框架
Ubuntu下搭建NodeJS+Express WEB开发框架 2012-12-27 15:06 作者: NodeJSNet 来源: 本站 浏览: 2,966 次阅读 我要评论暂无评论 字号: 大 中 ...
- Python操作MySQL以及中文乱码的问题
Python操作MySQL需要安装Python-MySQL可以从网上搜索一下,和一般的Python包一样安装 安装好之后,模块名字叫做MySQLdb ,在Window和Linux环境下都可以使用,试验 ...
- 【微信开发之问题集锦】redirect_uri 参数错误
问题答案:看看网页授权域名是不是以"http://",是则去掉.(如果网页授权域名都没修改,那就去修改吧,要注意域名不要带"http://"."htt ...
- BAE3.0上的java+tomcat代码发布
---------------------------------2016/01/25更新-------------------------------------- 最近两天去百度开放云,发现它再也 ...
- A2DP协议笔记
1.概述 A2DP(Advanced Audio Distribution Profile)是蓝牙的音频传输协议,典型应用为蓝牙耳机.A2DP协议的音频数据在ACL Link上传输,这与SCO ...