目录
flask 框架源码浅析结构
了解flask与其应用
flask是什么
(前言)
在浅析之前我们要知道flask是个什么东西,认知它的业务逻辑才能更好的使我们对它每一步源码推敲起来更加方便易懂。
Flask一种基于python ,并且依赖于Jinja2模板引擎和 Werkzeug WSGI服务的一种微型框架。其中:
Jinja2模板引擎(提供网页解析):通俗来讲就是服务器接收到用户请求之后,将数据传入HTML文件中后,经过模板引擎的渲染将其呈现在网页中响应给用户。
Werkzeug WSGI(python web应用与web 服务之间的接口):python web 应用程序是一个被调用的对象,它无法直接与web 服务器直接建立联系,所以WSGI的功能就是提供程序与服务之间的通信。它规定了一个app接口,server会传递给 web 应用所有的请求信息以及响应之后需要调用的函数。负责核心的逻辑模块,比如路由、请求和应答的封装、WSGI 相关的函数等(重点看这个)
Flask负责解决的问题
1.作为一个应用,能够被HTTP服务器所调用,必须要有__call__方法
2.通过传入的请求信息(URL,HTTP方法等),找到正确的业务处理逻辑,即正确的视图函数
3.处理业务逻辑,这些逻辑可能包括表单检查,数据库CRUD等(这个在这篇文章里不会涉及)
4.返回正确的响应
5.在同时处理多个请求时,还需要保护这些请求,知道应该用哪个响应去匹配哪个请求,即线程保护
WSGI延伸
我们先看一下面向 http 的 python 程序需要关心哪些内容
请求
- 请求的方法 method
- 请求的地址 url
- 请求的内容
- 请求的头部 header
>> 请求的环境信息
响应 - 状态码 status_code
- 响应的数据
- 响应的头部
WSGI(Web Server Gateway Interface) 的任务就是把上面的数据在 http server 和 python 程序之间简单友好地传递。它是一个标准,被定义在PEP 333。需要 http server 和 python 程序都要遵守一定的规范,实现这个标准的约定内容,才能正常工作。
Flask框架模式
-
M(Models) —— 模型层:负责数据库的建模。
-
T(Templates) —— 模板层:用于处理用户显示的内容。如:html
-
V (Views)—— 视图层:处理与用户交互的部分内容。如:处理用户的请求并给出响应
用户在浏览器上请求地址,浏览器将请求发送给视图层,视图层根据请求地址分配对应的视图函数,视图函数通过模型层查找数据,并将数据传送给模板,最后模板层将数据响应在网页上。
现在我们来了解几个flask名词 以便于以下程序的理解
上下文(application context 和 request context)
每一段程序都有很多外部变量。只有像Add这种简单的函数才是没有外部变量的。一旦你的一段程序有了外部变量,这段程序就不完整,不能独立运行。你为了使他们运行,就要给所有的外部变量一个一个写一些值进去。这些值的集合就叫上下文。
Flask有两种上下文
RequestContext 请求上下文
Request 请求的对象,封装了Http请求(environ)的内容
Session 根据请求中的cookie,重新载入该访问者相关的会话信息。
AppContext 程序上下文
g 处理请求时用作临时存储的对象。每次请求都会重设这个变量
current_app 当前激活程序的程序实例
#####上下文源代码
请求上下文
class Flask(_PackageBoundObject):
#这玩意代码太多 省略一部分
def request_context(self, environ):
"""ctx = app.request_context(environ)
ctx.push()
try:
do_something_with(request)
finally:
ctx.pop()"""
return RequestContext(self, environ)
看下request_context源码看他的返回值,他返回的其实是RequestContext类生成的一个实例对象,看字面意思就知道是一个请求上下文的实例对象了.这里可以注意看下官方的函数说明,它举了一个例子,非常简单,ctx先push,最后再pop
继续往下层看,RequestContext是从ctx.py模块中引入的,所以去找RequestContext的定义
class RequestContext(object):