Python中的http.server初步使用教程与学习心得 Python3搭建网页

如何使用Python3搭建一个网页?我不经这么想,为了探寻这个问题我开始查了资料,下面是我查资料过程遇到的一个问题与几个坑。

网上有人说使用Python的标准库SimpleHTTPServer来构建一个简单的网页,但是我使用pip安装时并没有搜索到这个库,到官方文档查看时才发现,这个库是Python2的,Python3附加到了http.server。如下图:点我去此页面

框起来的地方翻译如下:

注意:SimpleHTTPServer模块已经在Python3中合并到http.server中了。在将源代码转换为python3时,2to3工具将自动调整导入。

所以我转向去了http.server模块。

百度上搜索到的没有一步一步的教程,直接是放代码,即是这样可以也难以理解,而且有些是直接调用http.server的完整的代码,一句话搭建一个网页,如下:

图片来源:https://jingyan.baidu.com/article/642c9d34b99565244a46f7c5.html

所以我只好接着一点点破破的英语技术去看官方文档了。不过巧的是,Python3中的标准库居然有官方中文!天助我也!链接如下:https://docs.python.org/zh-cn/3.8/library/http.server.html

开始创作了,

首先读第一段,这是往往引导我们开始关键,

框中的代码,引导我们开始,这是一个基本框架,把它写到Py文件里如下:

 

 

# -*- coding:utf-8 -*-
from http.server import HTTPServer, BaseHTTPRequestHandler
 
def run(server_class=HTTPServer, handler_class=BaseHTTPRequestHandler):
    server_address = ('', 8000)  # 提供IP与端口
    httpd = server_class(server_address, handler_class)  # 绑定IP端口 使用BaseHTTPRequestHandler来处理HTTP请求
    httpd.serve_forever()  # 使服务器持续执行

 

 

对于HTTPServer类官方的解释如下:

对于 BaseHTTPRequestHandler官方解释如下:

    

我也找出每一句代码对应的意思,对于server_forever函数官方并没有直接在此篇陈述,因为此函数来源于HTTPServer,上面官方说过此类基于TCPServer,所以我们要到TCPServer中找,当我打开TCPServer的文档的时候发现,居然没有中文!!!

链接地址:https://docs.python.org/zh-cn/3.8/library/socketserver.html#socketserver.TCPServer

自己翻译了一下:

差不多是让服务器持续执行,即使遇到错误也执行。

修改一下:

由于这里我们没有给程序设定任何响应,运行访问后显示:

查阅官方文档我们可以更加清楚的看到BaseHTTPRequestHandler类的实例变量。但是仍是有很多局限,在翻阅过程中我找到了这个函数:

是用来处理用户GET请求的

此函数出现在SimpleHTTPRequestHandler类里,而不是BaseHTTPRequestHandler类。

在查阅源代码中发现:SimpleHTTPRequestHandler中继承了BaseHTTPRequestHandler类,BaseHTTPRequestHandler是SimpleHTTPRequestHandler的子类。

在有了do_GET() 后,我尝试搜索了do_POST(),还真有在CGIHTTPRequestHandler类中

此类又继承SimpleHTTPRequestHandler,

文档中示意我们把CGIHTTPRequestHandler 作为子类继承。写一个简单的代码:

from http.server import HTTPServer, CGIHTTPRequestHandler

   

   

class Resquest(CGIHTTPRequestHandler):

def do_GET(self):

print("有用户GET请求!")

   

   

def run(server_class=HTTPServer, handler_class=Resquest):

server_address = ('', 8000) #提供IP与端口

print("在", server_address, "启动套接字。")

httpd = server_class(server_address, handler_class) #绑定IP端口 使用BaseHTTPRequestHandler来处理HTTP请求

httpd.serve_forever() #使服务器持续执行

   

   

run(HTTPServer, Resquest)

 

效果:

控制台:

实验很成功,现在再来看一下还有什么函数可以使用,浏览器说没有返回数据,那么我们看看有没有返回数据的函数呢?

文档中有这样描述:

看来这就是答案了。但是wfile不是写的意思,更像是WebFile的缩写,可以把它理解成用户将要收到的网页。

是io.BufferedIOBase数据类型,我们看看这个数据类型可以如何操作,深入此操作文档。

网页地址:https://docs.python.org/zh-cn/3.8/library/io.html#io.BufferedIOBase

太多了,截取一段:

可以用write方法写入,b为字节。Ok,就是编个码嘛。

修改代码:

什么情况???

无效的相应,经过查阅与思考,是由于Content-type类型不对,没有告诉编译器是什么类型的文件。

这是一个正常的网页具备的基本条件。

文档中有这样一句话,大概就是可以用这个函数设定header中的值。设置完毕后要end_headers() 结尾。

使用我们加一句。

加了之后还是不可以,那我们把状态码也写了。

200表示正常访问。状态码具体看这里:https://www.runoob.com/http/http-status-codes.html

啊,功夫不负有心人。

接着我们可以开始设计网页了,但是还有一点:网页路径如何获取?

官方文档给了我们答案。

查看path内容并输出。

可以正常获取。

 

 

 

至此,恭喜你已经初步踏入http.server模块了。

 

感谢您的阅读

发表评论 (0)

后再参与讨论
公告
公告