如何用python基于html写一个个人网页 用python写web网页_网络

简单的学了下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 连接上, 客户端首先发送请求说明它需要什么, 然后服务器发送响应,
并在响应中包含客户端的数据。响应数据也许是从本地磁盘上复制来的,也许是程
序动态生成的。传输过程如图:

如何用python基于html写一个个人网页 用python写web网页_python_02

HTTP 请求就是一段文本,任何程序都能生成一个 http 请求,就像生成文本一样简

单。这段文本需要包含以下这些部分:

如何用python基于html写一个个人网页 用python写web网页_服务器_03

 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 响应的结构类似于请求:

如何用python基于html写一个个人网页 用python写web网页_python_04

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服务器就已经完成啦~~

后续会变动下,赶去写作业了。。。。。