python3 实现简单的 web 服务器
第一部分内容
项目知识点
-
本项目完成过程中,我们将学习:
- HTTP 协议基本原理
- 简单的 Web 服务器框架
- Python 语言的网络开发
- Web 服务请求,响应及错误处理的实现
- CGI 协议的 Python 实现
- 使用 Python 面向对象思想重构代码
-
开发环境
- Xfce终端
- python 3.5
- httpie 0.9.2
http 原理
-
一般我们的 web 程序都运行在 TCP/IP 协议上,程序之间使用 socket(套接字) 进行通信,它能够让计算机之间的通信就像写文件和读文件一样简单。
-
一个 tcp socket 由一个 IP 地址和端口号组成。
- IP地址是一个32位的二进制数,通常被分割为4个8位二进制数,写成10进制的形式就是我们常见的174.136.14.108。
- 我们通过IP地址来标识所连接的主机。
- 端口号是一个范围在0-65535之间的数字,一台主机上可能同时有多个 sockets,因此需要端口号进行标识。
- 端口号0-1023是保留给操作系统使用的,我们可以使用剩下的端口号。
-
超文本传输协议(HTTP)描述了一种程序之间交换数据的方法,它非常简单易用。
- 在一个 socket 连接上,客户端首先发送请求说明它需要什么,然后服务器发送响应,并在响应中包含客户端的数据。
- 响应数据也许是从本地磁盘上复制来的,也许是程序动态生成的。
- 传输过程如图:
-
HTTP 请求就是一段文本,任何程序都能生成一个 http 请求,就像生成文本一样简单。这段文本需要包含以下这些部分:
-
HTTP method:HTTP 请求方法。最常用的就是 GET (抓取数据)与 POST (更新数据或者上传文件);
-
URL:通常是客户端请求的文件的路径,比如 /research/experiments.html,但是是否响应文件都是由服务器决定的;
-
HTTP version:HTTP 版本。通常是 HTTP/1.0 或 HTTP/1.1;
-
header field:HTTP 头的键值对,做一些基本设置,就像下面这样:
# 客户端接受的数据类型 Accept: text/html # 客户端接受的语言 Accept-Language: en, fr If-Modified-Since: 16-May-2005
-
body:一些与请求有关的负载数据。比如在一个网站登陆的时候提交登陆表单,那负载数据就是你的账号与密码信息。
-
-
HTTP响应的结构类似于请求:
- status code:状态码。请求成功响应200,请求的文件找不到则响应404。
- status phrase:对状态码的描述。