一文学会在Python中搭建静态Web服务器

 

首先我们先来了解一下什么是静态的Web服务器

1.静态Web服务器:可以向给服务器发出请求的浏览器返回静态资源的文档的程序

生活中我们访问的比如CSDN中的各种文章的时候,那些文章每天都不一样,每天都会更新,这个网页就是动态的, 而咱们搭建的是静态的,页面的数据不会变。

2. 如何搭建Python自带的静态Web服务器

(1)首先需要有一个html文件,也就是得需要准备一个带有html页面的文件夹

(2)然后通过python中的命令行搭建一个Python自带的Web静态服务器

效果图:(先进入带有html页面的文件中再执行python3 –m http.server 端口号)---断奶口号不指定默认是8000

现在代表Python自带的静态Web服务器已经搭建成功。

 (3)可以查看一下HTTP的通信过程:

 

 

3.在Python中手动搭建静态Web服务器

首先说一下实现步骤:

  1. 把提供服务的Web服务器抽象成一个类
  2. 提供Web服务器的初始化方法,在初始化方法中创建socket对象
  3. 提供一个启动Web服务器的方法,让Web服务器同时并且无限处理客户端的请求

 

有了实现步骤,接下来我们就在python中开始搭建吧。(程序中有详细注释)

 

Python搭建静态Web服务器代码如下:


# 导入套接字模块,进程之间通信的工具模块

import socket

# 导入线程模块,提高程序效率

import threading

# 导入命令行,可实现在命令行中更改服务器端口号

import sys





# 创建一个Web服务器类

class WebServer(object):



   # 定义初始化方法来定义socket关键字

   def __init__(self,port):

        # 1 创建服务器端套接字对象

        web_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        # 端口复用

        web_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

        # 2 绑定端口

        web_server.bind(("", port))

        # 3 设置监听

        web_server.listen(128)

        # 将服务器套接字对象设置为self

        self.web_server = web_server



   # 定义一个静态方法专门处理浏览器请求

   @staticmethod

   def dispose_client_request(web_client):

        # 5 接收浏览器发来的请求报文信息

        request_data = web_client.recv(4096)

        # 对接收到的请求数据进行分析,拿到用户想要访问的资源路径

        request_path = request_data.decode().split(" ")[1]



        # 进行判断

        # 1长度是否为0,如果为0说明用户关闭了浏览器

        if not request_data:

            print("用户关闭了浏览器...")

            web_client.close()

            return

        # 2用户是否访问的是根目录

        if request_path == "/":

            request_path = "/index.html"

        # 设置响应行

        response_line = "HTTP/1.1 200 OK\r\n"

        # 设置响应头

        response_header = "Server: WTT/1.1\r\n"



        # 判断异常并进行处理

        try:

        # 1用户输入的路径确实在服务器中有资源的情况下

            with open("./static" + request_path,'rb') as file1:

                response_body = file1.read()



        # 2用户输入的路径在服务器中找不到的情况下

        except Exception:

            with open("./static/404.html",'rb') as file2:

                response_body = file2.read()

                response_line = "HTTP/1.1 404 Found\r\n"

        finally:

            # 拼接响应行、响应头以及响应体

            response_message = (response_line + response_header + "\r\n").encode() + response_body

            # 6 将拼接好的数据返回给用户的浏览器

            web_client.send(response_message)

            # 7 关闭浏览器端的套接字

            web_client.close()



   # 定义一个方法启动Web服务器

   def StartServer(self):

        # 4 循环接收浏览器建立连接的请求

        while True:

            web_client, web_client_address = self.web_server.accept()

        # 创建子线程对象,调用专门处理浏览器请求的方法

            thd = threading.Thread(target=self.dispose_client_request, args = (web_client,))

        # 设置守护主线程

            thd.setDaemon(True)

        # 启动子线程

            thd.start()





def main():



    # 判断命令行输入的格式是否符合要求

    if not sys.argv[1].isdigit() or len(sys.argv)!=2 :

        print("命令格式为:python3 xxx.py 端口号")

        return

    # 如果符合要求 将端口号赋给port

    port = int(sys.argv[1])

    # 创建Web服务器实例对象,将端口号当做参数传过去

    Web_obj = WebServer(port)

    # 使用对象调用启动Web服务器方法

    Web_obj.StartServer()



if __name__ == '__main__':



    # 调用main函数

    main()

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值