一、Web框架
首先我们今天要做的事是开发一个Web框架。可能听到这你就会想、是不是很难啊?这东西自己能写出来?
如果你有这种疑惑的话,那就继续看下去吧。相信看完今天的内容你也能写出一个自己的Web框架。
1.1、Web服务器
要知道什么是Web框架首先要知道Web服务器的概念。Web服务器是一个无情的收发机器,对它来说,接收和发送是最主要的工作。在我们用浏览器打开网页时,如果不考虑复杂情况,我们可以理解为我们在向服务器要东西,而服务器接到了你的请求后,根据一些判断,再给你发送一些内容。
仔细一想,其实这一个套接字(Socket)。
1.2 Web框架
那Web框架是什么呢?Web框架其实就是对Web服务器的一个封装,最原始的服务器只有一个原生的Socket,它可以做一些基本的工作。但是想用原生Socket做Web开发,那你的事情就多了去了。
而Web框架就是对Socket的高级封装,不同的Web框架封装程度不同。像Django是封装地比较完善的一个框架,而Flask则要轻便得多。
那他们只会封装Socket吗?我们接着往下看!
1.3 MVC和MTV
现在大多数框架都是MCV模式或者类MCV模式的。那MCV的含义是什么呢?具体含义如下:
model:模型层
view:视图层
controller:控制层(业务逻辑层)
下面我们来具体解释一下:
模型很好理解,就是我们常说的类,我们通常会将模型和数据库表对应起来。
视图层关注的是我们展示的页面效果,主要就是html、css、js等。
控制层,其实把它称作业务逻辑层要更好理解。也就是决定我要显示什么数据。
如果拿登录的业务来看。数据库中用户表对应的类就是属于模型层,我们看到的登录页面就是视图层,而我们处理判断登录的用户名密码等一系列内容就是业务逻辑层的内容。
那MTV又是什么呢?其实MTV就是MCV的另一种形式,model是一样的,而T的含义是Template,对应View。比较奇怪的就是MTV中的View,它对应Controller。
其实MVC和MTV没有本质区别。
1.4、框架封装的内容
在大多数框架中我们都不会去关注Socket本身,而更多的是去关注MTV三个部分。在本文,我们会去自己实现Template和View两个部分。
Template部分很好理解,就是我们通常的html页面。但是我们最终要实现的是动态页面(页面中的数据是动态生成的),因此我们需要对传统的html页面进行一些改造。这部分的工作需要我们定义一些特征标记,以及对html进行一些渲染工作。
而View部分我们会实现两个功能,一个是路由分发,另一个是视图函数。
路由分发的工作就是让我们对应不同的url,响应不同的内容。比如我请求http://www.test.com/login.html会返回登录页面,如果请求http://www.test.com/register.html则返回注册页面。
而视图函数则是针对每个请求的处理。后面我们会再提到。
知道了上面这些知识后,我们就可以着手开发我们的Web框架了。
二、实现一个Web服务器
服务器是Web框架的基础,而Socket是服务器的基础。因此我们还需要了解一下Socket的使用。
2.1 socket的使用
在python中socket的操作封装在socket.socket类中。我们先看下面这段代码,如何再来逐一解释:
import socket
# 创建一个服务端socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定ip和端口
server.bind(('127.0.0.1', 8000))
# 监听是否有请求
server.listen(1)
# 接收请求
conn, addr = server.accept()
# 接收数据
data = conn.recv(1024)
print(addr)
print(data.decode('utf-8'))
在我们做操作前,我们需要创建一个socket对象。在创建是我们传入了两个参数,他们规定了如下内容