阅读flask源码笔记

阅读flask源码

globals.py

定义线程变量的文件

这里使用了werkzeug模块的Local, LocalStack, LocalProxy

  • Local可以理解为创建了一个dict,key就是线程的id,这样每个线程就可以通过自己的id访问自己的数据
  • LocalStack是利用了Local实现的一个栈结构,每个线程的数据就是一个数组,实现了多线程隔离
  • LocalProxy最初是用于为Local为创建一个代理对象,对此代理对象执行的任意操作与直接对Local对象执行操作等价。之后,LocalProxy可以为方法创建代码对象,对此代理对象执行的任意操作与对被代理方法的返回值执行操作等价。这样做的好处是可以实时获取到最新的值

  • current_app, request, session, g都是在这里定义的

config.py

定义读取配置的方法

  • 读取配置文件的类就是config
  • 方法主要是通过from_object, from_mapping这三个方法
  • 最主要的就是将文件内容转化为obj型数据

json文件夹

  • init.py

这个文件夹主要是用来编码/解码数据用的,尤其是返回给客户端的response,解析客户端过来的request数据等
客户端发过来的请求数据,一般都是json的数据,返回去的数据也是json,因此,需要一个转json的方法来处理
有一些涉及到需要转码的方法,例如需要将html无法识别的特殊字符转化的方法也在这文件中

  • tag.py

这个文件定义了一系列方法,用来解析不规则的一些文件,字符等。例如html语言的文本,python中的tuple, list, dict

helpers.py

这个文件定义了很多辅助方法,重要的有以下几个

  • send_file方法定义了,需要返回客户端一个文件
  • flash方法,定义了上一个请求中存储的信息,下一个请求可以使用
  • url_for方法,根据后缀找到blueprint中定义好的路由
  • make_response方法,定义返回请求的数据
  • get_env获取应用启动时的环境参数

signals.py

这个文件定义了框架中一系列的信号,用作后期的通信,例如request_tearing_down这种都在里面,里面并没有定义额外的方法,都是使用的blinker模块的Namespace自带的

和hook的差别,主要在于hook函数支持abort,signal不支持;hook不支持额外的参数,而signal支持

templating.py

这个文件主要是定义了渲染的一系列方法
使用了jinja2模块的方法,并从全局变量中获取对象,然后在具体的模板中注入对象值

views.py

文件主要定义了视图类的方法,以及请求的方法定义

  • 注重定义了一个as_view的方法,可以将定义的类转化为多个请求实例,根据请求的method不同,而转向不同的方法函数,减少重复的代码
  • MethodView类,处理请求的method,将之绑定到对应的响应方法上去‘

logging.py

使用logging模块,封装了一层,专用来返回log的handler,并保证线程安全

scaffold.py

定义了一些hooks,包括before_request, after_request等等
在flask框架中,直接使用该装饰起就可以注册到app实例中执行

  • 从route方法中可以直接看到,通过app.route()注册的路由方法,实际上还是调用的app.add_url_rule()的方法,因此,这两个方法并没有区别
  • 其中endpoint方法,主要是提供给url_for来实现路由跳转的,url_for(endpoint)

sessions.py

这个文件主要是定义了会话和cookie的一系列操作

  • flask中使用的会话都是加密的
  • 框架中不直接使用cookie,框架已经将cookie转化为了cookie,再回调客户端的时候,再将session转化为cookie
  • 如果cookie已经被修改过了, 那么会直接删除

debughelper.py

用作开启debug模式的一些提示

ctx.py

flask中的上下文定义
包含了appcontext,requestcontext

  • g对象是绑定在request context上的
  • 这两个对象都是利用了线程栈的数据结构来操作数据

app.py

这个文件用来定义flask完整类
引入了flask模块中的其他依赖模块,函数,全局定义等

  • 定义了多个特性,带有@propery装饰器的部分
  • 定义了多个实现方法,带有@setupmethod

blueprints.py

定义路由的文件

  • 从Scaffold继承而来,因此,在路由层面可以直接引用各种hooks
  • register方法就是用来注册所有视图方法以及回调,和app绑定到一起