简单的学了下Python, 然后用Python实现简单的Web。
因为正在学习计算机网络,所以通过编程来加强自己对于Http协议和Web服务器的理解,也理解下如何实现Web服务请求、响应、错误处理以及CGI协议
一、需要知识点:
1. HTTP 协议基本原理
2. 简单的 Web 服务器框架
3. Python 语言的网络开发
4. Web 服务请求,响应及错误处理的实现
5. CGI 协议的 Python 实现
我用的Python3.5
二、原理:
web 程序都运行在 TCP/IP 协议上, 程序之间使用 socket(套接字)
进行通信,它能够让计算机之间的通信就像写文件和读文件一样简单。 一个 tcp
socket 由一个 IP 地址和端口号组成。
a. IP 地址是一个 32 位的二进制数,通常被分割为 4 个“8 位二进制数”,写成 10
进制的形式就是我们常见的 174.136.14.108。我们通过 IP 地址来标识所连
接的主机。
b. 端口号是一个范围在 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:对状态码的描述
下面进行第一个Web服务器, 基本概念十分简单:
1.等待某萌连接我们的服务器并向我们发送一个HTTP请求
2.解析该请求
3.了解该请求希望请求的内容
4.服务器根据请求抓取需要的数据(从服务器本地文件中读取或者程序动态生成)
5.将数据格式化为请求需要的格式
6.送回HTTP响应
上面的1,2,6的操作对所有的WEb应用都是一样的, 这部分内容Python标准库中的BaseHttpServer模块可以帮助我们处理啦。所以现在我们就仅仅需要关注3,4,5了:
首先呢,在工作目录下创建server.py文件:
import BaseHttpServer class RequestHandler(BaseHttpServer.BaseHttpRequestHandler:
"""docstring for RequestHandler(BaseHttpServer.BaseHttpRequestHandler""" #page model
Page = '''\
<html>
<body>
<p>I believe in you, Web!</p>
</body>
</html>
''' #deal with a get request
def do_GET(self):
#super(RequestHandler(BaseHttpServer.BaseHttpRequestHandler, self).__init__()
self.send_response(200)
self.send_header("Content-Type", "text/html")
self.send_header("Content-Length", str(len(self.Page)))
self.end_headers()
self.wfile.write(self.Page)
#-------------colorful Luxuriant lineO(∩_∩)O哈哈~---------- if __name__ == '__main__':
serverAddress = ('127.0.0.1', 5555)
server = BaseHttpServer.HttpServer(serverAddress, RequestHandler)
server.serve_forever()
模块的BaseHttpRequestHandler类可以帮助我们处理对请求的解析,并通过确定请求的方法类调用其所对应的函数, 如当方法是GET时,该类就会调用名为do_GET的方法。RequestHandler继承了BaseHttpRequestHandler并重写了do_GET方法,他的效果可以从代码中所示返回Page的内容。Content-Type告诉客户端要处理html文件的方式处理返回的内容。end_headers方法会插入一个空白行,前面的Request结构图所示可知。
运行程序,打开浏览器访问,此时我们的第一个web服务器就已经完成啦~~
后续会变动下,赶去写作业了。。。。。
可以在Python网站上更好的学习https://wiki.python.org/moin/BaseHttpServer