Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权
Flask的源码不是很多,可以说很少,关键的App.py带注释才两千行代码
而Flask的源码目录如下,结构非常清晰
- __main__.py
- _compat.py(兼容python 2/3)
- app.py(实际的WSGI应用)
- blueprints.py(实现蓝图功能)
- cli.py
- config.py(定义flask设置配置的多种方法)
- globals.py (全局请求上下文栈,全局应用上下文栈)
- logging.py(使用logging模块定义Flask的日志类)
- sessions.py (定义session基类,利用itsdangerous实现了安全的cookies_sessions子类,类似JWT)
- singails.py (导入Blinker模块实现flask的信号机制,并定义了一些信号量)
- templating.py (隐藏Jinja2的render接口,实现flask自己的render接口)
- views.py (实现类似django的as_view()方法)
- wrapper.py (WSGI框架request和reponse基类的一些封装)
WSGI 工具箱采用 Werkzeug
WSGI,全称Web服务器网关接口,或者Python Web服务器网关接口,是基于Python定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。WSGI接口的作用是确保HTTP请求能够转化成蟒蛇应用的一个功能调用,这也就是网关的意义所在,网关的作用就是在协议之前进行转换。
WSGI接口中有一个非常明确的标准,每个Python的网络应用必须是可调用的可调用的对象且返回一个iterator,并实现app(environ,start_response)的接口,server会调用应用程序,并传递给它的两个参数:environ包含请求的所有信息,start_response是应用程序处理完之后需要调用的函数,参数是状态码,响应头部还有错误信息引用。
Jinja2 是一个现代的,设计者友好的,仿照 Django 模板的 Python 模板语言。 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全:
<title>{% block title %}{% endblock %}</title> <ul> {% for user in users %} <li><a href="{{ user.url }}">{{ user.username }}</a></li> {% endfor %} </ul>
特性:
- 沙箱中执行
- 强大的 HTML 自动转义系统保护系统免受 XSS
- 模板继承
- 及时编译最优的 python 代码
- 可选提前编译模板的时间
- 易于调试。异常的行数直接指向模板中的对应行。
- 可配置的语法
信号机制使用blinker
Blinker 是一个基于Python的强大的信号库,它既支持简单的对象到对象通信,也支持针对多个对象进行组播。Flask的信号机制就是基于它建立的。
Blinker的内核虽然小巧,但是功能却非常强大,它支持以下特性:
- 支持注册全局命名信号
- 支持匿名信号
- 支持自定义命名信号
- 支持与接收者之间的持久连接与短暂连接
- 通过弱引用实现与接收者之间的自动断开连接
- 支持发送任意大小的数据
- 支持收集信号接收者的返回值
- 线程安全
SecureCookieSessionInterface使用itsdangerous(类似jwt)
有时您只想将一些数据发送到不受信任的环境。但如何安全地做到这一点呢?诀窍在于签字。给一个只有你知道的密钥,你可以用加密的方式签署你的数据并把它交给其他人。当你拿回数据时,你可以很容易地确保没有人篡改它。
当然,接收者可以解码内容并查看包,但除非他们也有您的密钥,否则不能修改内容。所以,如果你保守秘密和复杂,你会没事的。
在内部,它的危险性默认使用HMAC和SHA1进行签名,并基于Django签名模块实现。不过,它也支持JSON Web签名(JWS)。图书馆是BSD许可证,由Armin Ronacher编写,尽管设计和实现的大部分版权归Simon Willison和其他让这个图书馆成为可能的令人惊叹的Django人所有。