三个概念:
- HTTP (超文本传输传输协议)
规定了网络客户端和服务器之间如何交换请求和响应 - HTML(超文本标记语言)
结果的展示格式 - URL(统一资源定位符)
唯一表示服务器和服务器上资源的方法
一个最简单的场景:
一个Web客户端通过HTTP连接到一个Web服务器,请求一个URL,收到HTML。
Web客户端
互联网最底层的网络传输使用的是传输控制协议/因特网协议,更常用的叫法是TCP/IP。这些协议会在计算机之间传输字节,但是并不关心这些字节的含义,后者由更高层的协议——用于特定目的的语法定义——来处理。HTTP是Web数据交换的标准协议。
Web是一个客户端——服务器系统。客户端向服务器发起请求:它会创建一个TCP/IP连接,通过HTTP发送URL和其他信息并接收一个响应。
响应的格式也由HTTP定义。其中包括请求的状态以及(如果请求成功)响应的数据和格式。
Python的标准Web库
在Python2中,Web客户端和服务器模块结构都比较散乱。Python3的目标之一就是把这些模块打包成两个包。
http会处理所有客户端-服务器HTTP请求的具体细节:
- client会处理处理客户端的部分
- server会协助你编写Python Web服务器程序
- cookies和cookiejar会处理cookie,cookie可以在请求中存储数据
urllib是基于http的高层库:
- request处理客户端请求
- response处理服务器端的响应
- parse会解析URL
例子
HTTP状态码:
- 1xx(信息)
服务器收到了请求,但是需要客户端发送一些额外的信息。 - 2xx(成功)
请求成功。除了200以外,其他的状态码还会包含一些特殊含义。 - 3xx(重定向)
资源位置发生改变,所以响应会返回一个新的URL给客户端。 - 4xx(客户端错误)
客户端发送错误,比如最出名的404(页面不存在)。 - 5xx(服务端错误)
500是最常见的错误。你可能也见到过502(网关错误),这表示Web服务器程序和后端的应用服务器之间无法连接。
响应的HTTP头:
- Content-Type (MIME类型)
- Set-Cookie(用来在多次访问之间追踪你的活动)
下面代码可以得到最终返回的数据是什么(不是HTTP首部的部分)
data = conn.read()
print(data)
抛开标准库:requests
pip install requests
在大多数情况下,使用requests可以让Web客户端开发变得更加简单。
例子
import requests
url = 'http://www.baidu.com'
resp = requests.get(url)
print(resp.text)
Web服务端
最简单的Python Web服务器
可以用一行Python代码启动一个简单的Web服务器
现在你可以通过相对路径来请求文件,它们会被Web服务器返回。如果你在Web浏览器中输入http://localhost:8000,会看到一个目录列表:
Web服务器会打印出下面这样的访问日志:
- 127.0.0.1<=>localhost是客户端的IP地址
- 第一个”-“是远程用户名,本例为空
- 第二个”-“是登陆用户名,本例中是可选的,为空
- [29/Jul/2017 16:30:26]是访问日期和时间
- “GET / HTTP/1.1”是指Web服务器收到的指令
- 最后的200表示Web服务器返回的HTTP状态码
默认的端口数是8000,你也可以指定其他的数字:
python -m http.server 9999
这个Python特有的Web服务器很适合用作快速测试。一定不要把这个简单的Web服务器用在真正的产品级网站中。Nginx和Apache等传统Web服务器可以更快地处理静态文件。此外,这个简单的Web服务器不能处理动态内容,其它更高端的Web服务器可以接收参数并返回动态内容。
关于0.0.0.0这个ip地址的含义
0.0.0.0 is not the URL you should be visiting. When a Python says it is serving on 0.0.0.0 it means it is listening for all TCP traffic that ends up at that machine no matter the hostname or IP that was requested.
But, if you c