Python----静态Web服务器-返回指定页面数据

1. 静态Web服务器的问题

目前的Web服务器,不管用户访问什么页面,返回的都是固定页面的数据,接下来需要根据用户的请求返回指定页面的数据

返回指定页面数据的实现步骤:

  1. 获取用户请求资源的路径
  2. 根据请求资源的路径,读取指定文件的数据
  3. 组装指定文件数据的响应报文,发送给浏览器
  4. 判断请求的文件在服务端不存在,组装404状态的响应报文,发送给浏览器

2. 静态Web服务器-返回指定页面数据的示例代码

import socket


def main():
    # 创建tcp服务端套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置端口号复用, 程序退出端口立即释放
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 绑定端口号
    tcp_server_socket.bind(("", 9000))
    # 设置监听
    tcp_server_socket.listen(128)
    while True:
        # 等待接受客户端的连接请求
        new_socket, ip_port = tcp_server_socket.accept()
        # 代码执行到此,说明连接建立成功
        recv_client_data = new_socket.recv(4096)
        if len(recv_client_data) == 0:
            print("关闭浏览器了")
            new_socket.close()
            return

        # 对二进制数据进行解码
        recv_client_content = recv_client_data.decode("utf-8")
        print(recv_client_content)
        # 根据指定字符串进行分割, 最大分割次数指定2
        request_list = recv_client_content.split(" ", maxsplit=2)

        # 获取请求资源路径
        request_path = request_list[1]
        print(request_path)

        # 判断请求的是否是根目录,如果条件成立,指定首页数据返回
        if request_path == "/":
            request_path = "/index.html"

        try:
            # 动态打开指定文件
            with open("static" + request_path, "rb") as file:
                # 读取文件数据
                file_data = file.read()
        except Exception as e:
            # 请求资源不存在,返回404数据
            # 响应行
            response_line = "HTTP/1.1 404 Not Found\r\n"
            # 响应头
            response_header = "Server: PWS1.0\r\n"
            with open("static/error.html", "rb") as file:
                file_data = file.read()
            # 响应体
            response_body = file_data

            # 拼接响应报文
            response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
            # 发送数据
            new_socket.send(response_data)
        else:
            # 响应行
            response_line = "HTTP/1.1 200 OK\r\n"
            # 响应头
            response_header = "Server: PWS1.0\r\n"

            # 响应体
            response_body = file_data

            # 拼接响应报文
            response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
            # 发送数据
            new_socket.send(response_data)
        finally:
            # 关闭服务与客户端的套接字
            new_socket.close()

if __name__ == '__main__':
    main()

3. 小结

  1. 获取用户请求资源的路径

     request_list = client_request_conent.split(” ”,  maxsplit=2)
     request_path = request_list[1]
    
  2. 根据请求资源的路径,读取请求指定文件的数据

     with open("static" + request_path, "rb") as file:
     file_data = file.read()
    
  3. 组装指定文件数据的响应报文,发送给浏览器

     response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
     conn_socket.send(response_data)
    
  4. 判断请求的文件在服务端不存在,组装404状态的响应报文,发送给浏览器

     try:
         # 打开指定文件,代码省略...
     except Exception as e:
         conn_socket.send(404响应报文数据)

相关推荐

  1. Python---静态Web服务器-返回固定页面数据

    2023-12-26 23:04:02       43 阅读
  2. Python---静态Web服务器-多任务版

    2023-12-26 23:04:02       40 阅读
  3. uni-app 如何返回指定页面

    2023-12-26 23:04:02       27 阅读
  4. Hive 使用 LIMIT 指定偏移量返回数据

    2023-12-26 23:04:02       22 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-26 23:04:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-26 23:04:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-26 23:04:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-26 23:04:02       20 阅读

热门阅读

  1. 个人收藏学习(1)

    2023-12-26 23:04:02       32 阅读
  2. Go Web 编程

    2023-12-26 23:04:02       37 阅读
  3. 【golang】init()函数是什么时候执行的?

    2023-12-26 23:04:02       35 阅读
  4. rabbitmq的事务实现、消费者的事务实现

    2023-12-26 23:04:02       27 阅读
  5. vue elementUI el-form 数据无法赋值且不报错解决方法

    2023-12-26 23:04:02       37 阅读
  6. ARAM 中断实验

    2023-12-26 23:04:02       34 阅读
  7. TypeScript学习(面试篇)

    2023-12-26 23:04:02       27 阅读
  8. LeetCode 每日一题 Day 23 || 简单数学题

    2023-12-26 23:04:02       41 阅读
  9. Mybatis之什么是Mybatis框架

    2023-12-26 23:04:02       35 阅读
  10. LeetCode——1276. 不浪费原料的汉堡制作方案

    2023-12-26 23:04:02       37 阅读
  11. 为什么Nginx是无状态的,而Redis是有状态的?

    2023-12-26 23:04:02       28 阅读