> For the complete documentation index, see [llms.txt](https://meetbill.gitbook.io/butterfly-project-doc/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://meetbill.gitbook.io/butterfly-project-doc/project-framework/what.md).

# 二 what

## 写一个 Web 框架需要做什么？

* 1 引言
  * 1.1 JavaWeb 经典三层框架
  * 1.2 MVC/MTV 设计模式
* 2 实现
  * 2.1 第一层解耦 (WSGI)：通过网关协议，实现 Web 服务器和 Web 应用程序的可插拔性
  * 2.2 第二层解耦 (C)：通过路由系统，实现 http 请求和 http 应答之间的解耦
  * 2.3 第三层解耦 (V)：通过模板引擎，实现数据和模板之间解耦
  * 2.4 第四层解耦 (M)：通过 ORM 操作数据库，实现数据层的灵活操作
* 3 核心组件

### 1 引言

#### 1.1 JavaWeb 经典三层框架

Web 三层架构是将后台应用分为：表现层，业务逻辑层，数据访问层

> * 表现层（UI）：展现给用户的界面，即用户在使用一个系统的时候他的所见所得。
> * 业务逻辑层（BLL）：针对具体问题的操作，对数据层的操作，对数据业务逻辑处理。
> * 数据访问层（DAL）：直接操作数据库，针对数据的增添、删除、修改、查找等。

#### 1.2 MVC/MTV 设计模式

python 的 MVC 和 java 的一样，分别是 Model、View、Controller，也就是我们通常说的模型 (model)－视图 (view)－控制器 (controller)，分别对应着数据库、模板文件、业务处理。

MTV 分别是 Model、Template、View，分别对应的是数据库、模板文件、业务处理，python Django，用的就是 MTV 模式

### 2 实现

```
计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决
Any problem in computer science can be solved by anther layer of indirection.
```

> * （1）抽象出代码中共同的部分，实现代码重用，降低编程的难度。
> * （2）解耦合，将 web 编程模块化，使得能像积木一样灵活组合。

#### 2.1 第一层解耦 (WSGI)：通过网关协议，实现 Web 服务器和 Web 应用程序的可插拔性

通过 WSGI， 即可以使 web 服务器和 web 应用框架可以实现自由组合。

于是就提出了网关接口，主要接口协议有 CGI，FastCGI,WSGI，Java 的 serlet 等。

#### 2.2 第二层解耦 (C)：通过路由系统，实现 http 请求和 http 应答之间的解耦

web 框架通过建立 url 与 handler 函数之间的映射关系（即路由系统），输入 http 请求，调用相应的 handler 函数，输出对应的 http 响应。

通过实现路由系统，我们可以自由的绑定 url 和 handler 函数，从而灵活的进行修改。

#### 2.3 第三层解耦 (V)：通过模板引擎，实现数据和模板之间解耦

尽管现在大趋势为前后端分离，通过 json 传递数据，但是模板还是一个 web 框架常见的组成部分。

通过向模板中填充数据来生成动态页面，就可以通过不同组合生成不同的页面，使得代码重用性和灵活性大大提高。

不过还是推荐使用前后端分离 :-)

#### 2.4 第四层解耦 (M)：通过 ORM 操作数据库，实现数据层的灵活操作

通过使用 ORM 避免了直接写 sql 语句的麻烦和可能产生的错误，使用对象模型来表示表，可以更加清晰的表示逻辑。

ORM 的原理，通过就是将一个数据库客户端进行封装，然后通过调用方法，生成 sql 语句，对数据库进行操作。

### 3 核心组件

* [x] 路由系统
* [x] 模板引擎
* [x] 数据库 ORM
* [x] 日志模块
* [ ] Auth 认证模块
