百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

搭建Python自带静态Web服务器 python 搭建的http 动态服务器

myzbx 2024-12-17 15:13 21 浏览

静态web服务器是什么?

可以为发出请求的浏览器提供静态文档的程序。

平时我们浏览新闻数据的时候,每天的新闻数据都会发生变化,那访问的这个页面就是动态的,而我们开发的是静态的,页面的数据不会发生变化。

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

搭建Python自带的静态web服务器使用 python -m http.server 端口号,端口号不指定默认8000

-m选项说明:

  • -m表示运行包里面的模块,执行这个命令的时候,需要进入你自己指定静态文件的目录,然后通过浏览器就能访问对应的html文件了,这样一个静态的web服务器就搭建好了。

静态web服务器-返回固定页面数据

import socket

# 判断是否是主模块的代码
if __name__ == '__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(('', 8000))
    # 设置监听
    tcp_server_socket.listen(128)
    # 循环等待接受客户端的连接请求
    while True:
        # 等待接受客户端的连接请求
        new_socket, ip_port = tcp_server_socket.accept()
        # 代码执行到此,说明连接建立成功
        # 接收客户端的请求信息
        recv_data = new_socket.recv(4096)
        print(recv_data)

        # 打开文件,读取文件中的数据
        # 这里的file表示打开文件的对象
        with open('static/index.html', 'r') as file:
            file_data = file.read()
        # 提示:with open 关闭文件这步操作不用程序员书写,系统自动完成

        # 响应行
        response_line = 'HTTP/1.1 200 OK\r\n'
        # 响应头
        response_header = 'Server: PWS/1.0\r\n'
        # 响应体
        response_body = file_data

        # 把数据封装成http响应报文格式的数据
        response = response_line + response_header + '\r\n' + response_body
        # 把字符串编码成二进制
        response_data = response.encode('utf-8')
        # 发送给浏览器的响应报文数据
        new_socket.send(response_data)
        # 关闭服务于客户端的套接字
        new_socket.close()

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

import socket
import os


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(('', 8000))
    # 设置监听
    tcp_server_socket.listen(128)
    # 循环等待接受客户端的连接请求
    while True:
        # 等待接受客户端的连接请求
        new_socket, ip_port = tcp_server_socket.accept()
        # 代码执行到此,说明连接建立成功
        # 接收客户端的请求信息
        recv_data = new_socket.recv(4096)
        # 判断接收的数据长度是否为0
        if len(recv_data) == 0:
            new_socket.close()
            return

        # 对二进制数据进行解码
        recv_content = recv_data.decode('utf-8')
        print(recv_content)

        # 对数据按照空格进行分割
        request_list = recv_content.split(' ', maxsplit=2)
        # 获取请求的资源路径
        request_path = request_list[1]
        print(request_path)

        # 判断请求的是否是根目录,如果是,设置根目录
        if request_path == '/':
            request_path = '/index.html'

        # 1. os.path.exists
        # os.path.exists('static/' + request_path)
        # 2. try-except
        try:
            # 打开文件,读取文件中的数据,这里使用rb模式,兼容打开图片文件
            # 这里的file表示打开文件的对象
            with open('static' + request_path, 'rb') as file:
                file_data = file.read()
            # 提示:with open 关闭文件这步操作不用程序员书写,系统自动完成
        except Exception as e:
            # 代码执行到此,说明没有请求的该文件,返回404状态信息
            # 响应行
            response_line = 'HTTP/1.1 404 Not Found\r\n'
            # 响应头
            response_header = 'Server: PWS/1.0\r\n'
            # 读取404页面数据
            with open('static/error.html', 'rb') as file:
                file_data = file.read()
            # 响应体
            response_body = file_data

            # 把数据封装成http响应报文格式的数据
            response = (response_line +
                        response_header +
                        '\r\n').encode('utf-8') + response_body
            # 发送给浏览器的响应报文数据
            new_socket.send(response)
            pass
        else:
            # 代码执行到此,说明文件存在,返回200状态信息
            # 响应行
            response_line = 'HTTP/1.1 200 OK\r\n'
            # 响应头
            response_header = 'Server: PWS/1.0\r\n'
            # 响应体
            response_body = file_data

            # 把数据封装成http响应报文格式的数据
            response = (response_line +
                        response_header +
                        '\r\n').encode('utf-8') + response_body
            # 发送给浏览器的响应报文数据
            new_socket.send(response)
        finally:
            # 关闭服务于客户端的套接字
            new_socket.close()


# 判断是否是主模块的代码
if __name__ == '__main__':
    main()

静态web服务器-多任务版

import socket
import threading


# 处理客户端请求
def handle_client_request(new_socket):
    # 接收客户端的请求信息
    recv_data = new_socket.recv(4096)
    # 判断接收的数据长度是否为0
    if len(recv_data) == 0:
        new_socket.close()
        return

    # 对二进制数据进行解码
    recv_content = recv_data.decode('utf-8')
    print(recv_content)

    # 对数据按照空格进行分割
    request_list = recv_content.split(' ', maxsplit=2)
    # 获取请求的资源路径
    request_path = request_list[1]
    print(request_path)

    # 判断请求的是否是根目录,如果是,设置根目录
    if request_path == '/':
        request_path = '/index.html'

    # 1. os.path.exists
    # os.path.exists('static/' + request_path)
    # 2. try-except
    try:
        # 打开文件,读取文件中的数据,这里使用rb模式,兼容打开图片文件
        # 这里的file表示打开文件的对象
        with open('static' + request_path, 'rb') as file:
            file_data = file.read()
        # 提示:with open 关闭文件这步操作不用程序员书写,系统自动完成
    except Exception as e:
        # 代码执行到此,说明没有请求的该文件,返回404状态信息
        # 响应行
        response_line = 'HTTP/1.1 404 Not Found\r\n'
        # 响应头
        response_header = 'Server: PWS/1.0\r\n'
        # 读取404页面数据
        with open('static/error.html', 'rb') as file:
            file_data = file.read()
        # 响应体
        response_body = file_data

        # 把数据封装成http响应报文格式的数据
        response = (response_line +
                    response_header +
                    '\r\n').encode('utf-8') + response_body
        # 发送给浏览器的响应报文数据
        new_socket.send(response)
        pass
    else:
        # 代码执行到此,说明文件存在,返回200状态信息
        # 响应行
        response_line = 'HTTP/1.1 200 OK\r\n'
        # 响应头
        response_header = 'Server: PWS/1.0\r\n'
        # 响应体
        response_body = file_data

        # 把数据封装成http响应报文格式的数据
        response = (response_line +
                    response_header +
                    '\r\n').encode('utf-8') + response_body
        # 发送给浏览器的响应报文数据
        new_socket.send(response)
    finally:
        # 关闭服务于客户端的套接字
        new_socket.close()


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(('', 8000))
    # 设置监听
    tcp_server_socket.listen(128)
    # 循环等待接受客户端的连接请求
    while True:
        # 等待接受客户端的连接请求
        new_socket, ip_port = tcp_server_socket.accept()
        # 代码执行到此,说明连接建立成功
        sub_thread = threading.Thread(target=handle_client_request, args=(new_socket,))
        # 设置成为守护主线程
        sub_thread.setDaemon(True)
        # 启动子线程执行对应的任务
        sub_thread.start()


# 判断是否是主模块的代码
if __name__ == '__main__':
    main()

静态web服务器-面向对象开发

实现步骤

  1. 把提供服务的web度武器抽象成一个类(HTTPWebServer)
  2. 提供web服务器的初始化方法,在初始化方法里面创建socket对象
  3. 提供一个开启web服务器的方法,让web服务器处理客户端请求操作
import socket
import threading


# http协议的web服务器类
class HttpWebServer(object):
    def __init__(self):
        # 创建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(('', 8000))
        # 设置监听
        tcp_server_socket.listen(128)
        # 把tcp服务端的套接字作为web服务器对象的属性
        self.tcp_server_socket = tcp_server_socket

    # 启动服务器的方法
    def start(self):
        # 循环等待接受客户端的连接请求
        while True:
            # 等待接受客户端的连接请求
            new_socket, ip_port = self.tcp_server_socket.accept()
            # 代码执行到此,说明连接建立成功
            sub_thread = threading.Thread(target=self.handle_client_request, args=(new_socket,))
            # 设置成为守护主线程
            sub_thread.setDaemon(True)
            # 启动子线程执行对应的任务
            sub_thread.start()

    # 处理客户端请求
    @staticmethod
    def handle_client_request(new_socket):
        # 接收客户端的请求信息
        recv_data = new_socket.recv(4096)
        # 判断接收的数据长度是否为0
        if len(recv_data) == 0:
            new_socket.close()
            return

        # 对二进制数据进行解码
        recv_content = recv_data.decode('utf-8')
        print(recv_content)

        # 对数据按照空格进行分割
        request_list = recv_content.split(' ', maxsplit=2)
        # 获取请求的资源路径
        request_path = request_list[1]
        print(request_path)

        # 判断请求的是否是根目录,如果是,设置根目录
        if request_path == '/':
            request_path = '/index.html'

        # 1. os.path.exists
        # os.path.exists('static/' + request_path)
        # 2. try-except
        try:
            # 打开文件,读取文件中的数据,这里使用rb模式,兼容打开图片文件
            # 这里的file表示打开文件的对象
            with open('static' + request_path, 'rb') as file:
                file_data = file.read()
            # 提示:with open 关闭文件这步操作不用程序员书写,系统自动完成
        except Exception as e:
            # 代码执行到此,说明没有请求的该文件,返回404状态信息
            # 响应行
            response_line = 'HTTP/1.1 404 Not Found\r\n'
            # 响应头
            response_header = 'Server: PWS/1.0\r\n'
            # 读取404页面数据
            with open('static/error.html', 'rb') as file:
                file_data = file.read()
            # 响应体
            response_body = file_data

            # 把数据封装成http响应报文格式的数据
            response = (response_line +
                        response_header +
                        '\r\n').encode('utf-8') + response_body
            # 发送给浏览器的响应报文数据
            new_socket.send(response)
            pass
        else:
            # 代码执行到此,说明文件存在,返回200状态信息
            # 响应行
            response_line = 'HTTP/1.1 200 OK\r\n'
            # 响应头
            response_header = 'Server: PWS/1.0\r\n'
            # 响应体
            response_body = file_data

            # 把数据封装成http响应报文格式的数据
            response = (response_line +
                        response_header +
                        '\r\n').encode('utf-8') + response_body
            # 发送给浏览器的响应报文数据
            new_socket.send(response)
        finally:
            # 关闭服务于客户端的套接字
            new_socket.close()


def main():
    # 创建web服务器
    web_server = HttpWebServer()
    # 启动服务器
    web_server.start()


# 判断是否是主模块的代码
if __name__ == '__main__':
    main()

获取终端命令行参数

import sys


# 获取终端命令行参数
params = sys.argv

# 列表里面的每项数据都是字符串类型
print(params, type(params))

静态web服务器-命令行启动动态绑定端口号

实现步骤

  1. 获取执行python程序的终端命令行参数
  2. 判断参数的类型,设置端口号必须是整型
  3. 给web服务器的初始化方法添加一个端口号参数,用于绑定端口号
import socket
import threading
import sys


# http协议的web服务器类
class HttpWebServer(object):
    def __init__(self, port):
        # 创建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(('', port))
        # 设置监听
        tcp_server_socket.listen(128)
        # 把tcp服务端的套接字作为web服务器对象的属性
        self.tcp_server_socket = tcp_server_socket

    # 启动服务器的方法
    def start(self):
        # 循环等待接受客户端的连接请求
        while True:
            # 等待接受客户端的连接请求
            new_socket, ip_port = self.tcp_server_socket.accept()
            # 代码执行到此,说明连接建立成功
            sub_thread = threading.Thread(target=self.handle_client_request, args=(new_socket,))
            # 设置成为守护主线程
            sub_thread.setDaemon(True)
            # 启动子线程执行对应的任务
            sub_thread.start()

    # 处理客户端请求
    @staticmethod
    def handle_client_request(new_socket):
        # 接收客户端的请求信息
        recv_data = new_socket.recv(4096)
        # 判断接收的数据长度是否为0
        if len(recv_data) == 0:
            new_socket.close()
            return

        # 对二进制数据进行解码
        recv_content = recv_data.decode('utf-8')
        print(recv_content)

        # 对数据按照空格进行分割
        request_list = recv_content.split(' ', maxsplit=2)
        # 获取请求的资源路径
        request_path = request_list[1]
        print(request_path)

        # 判断请求的是否是根目录,如果是,设置根目录
        if request_path == '/':
            request_path = '/index.html'

        # 1. os.path.exists
        # os.path.exists('static/' + request_path)
        # 2. try-except
        try:
            # 打开文件,读取文件中的数据,这里使用rb模式,兼容打开图片文件
            # 这里的file表示打开文件的对象
            with open('static' + request_path, 'rb') as file:
                file_data = file.read()
            # 提示:with open 关闭文件这步操作不用程序员书写,系统自动完成
        except Exception as e:
            # 代码执行到此,说明没有请求的该文件,返回404状态信息
            # 响应行
            response_line = 'HTTP/1.1 404 Not Found\r\n'
            # 响应头
            response_header = 'Server: PWS/1.0\r\n'
            # 读取404页面数据
            with open('static/error.html', 'rb') as file:
                file_data = file.read()
            # 响应体
            response_body = file_data

            # 把数据封装成http响应报文格式的数据
            response = (response_line +
                        response_header +
                        '\r\n').encode('utf-8') + response_body
            # 发送给浏览器的响应报文数据
            new_socket.send(response)
            pass
        else:
            # 代码执行到此,说明文件存在,返回200状态信息
            # 响应行
            response_line = 'HTTP/1.1 200 OK\r\n'
            # 响应头
            response_header = 'Server: PWS/1.0\r\n'
            # 响应体
            response_body = file_data

            # 把数据封装成http响应报文格式的数据
            response = (response_line +
                        response_header +
                        '\r\n').encode('utf-8') + response_body
            # 发送给浏览器的响应报文数据
            new_socket.send(response)
        finally:
            # 关闭服务于客户端的套接字
            new_socket.close()


def main():
    # 获取终端命令行参数
    params = sys.argv
    if len(params) != 2:
        print('执行的命令格式如下:python xxx.py 9000')
        return

    # 判断第二个参数是否都是由数字组成的字符串
    if not params[1].isdigit():
        print('执行的命令格式如下:python xxx.py 9000')
        return

    # 代码执行到此,说明命令行参数的个数一定是两个,并且第二个是由数字组成的字符串
    port = int(params[1])

    # 创建web服务器
    web_server = HttpWebServer(port)
    # 启动服务器
    web_server.start()


# 判断是否是主模块的代码
if __name__ == '__main__':
    main()

相关推荐

一键生成高颜值图表!让你的文字瞬间有画面感,职场人必备!

哈喽,打工人们!忙碌的周中,大熊又来给你们带来一个超实用的效率神器啦!这次的宝藏网站绝对是那种用过就离不开的"真香"型产品!假设你明天就要做重要汇报,可面对一大堆密密麻麻的文字材料,你...

批量将 Word 转换为 PDF/Excel/Txt/图片等多种格式

Word文档是我们工作中经常会打交道的一种文档格式,我们也经常会有需要对Word文档进行格式转换的需求,比如将Word格式转换为PDF、将Word文档转换为Excel、将Word...

绝了!一键用AI生成高颜值动态PPT(附详细步骤+Prompt)

大家好,我是一名酷爱研究AI的产品经理,最近我有个新发现:那些花了你3天做出来的PPT,现在用AI可以1小时搞定!而且颜值还高!为什么AI做PPT比传统方式效率高10倍?我用一张图就能告诉你:AI生成...

ztext - 简单几行代码创建酷炫3D特效文字的开源JS库

把网页上的文字变成酷炫的3D风格,还能制作旋转动效,有了ztext.js,只需要几行代码。ztext能做什么ztext.js是一个能把常规的平面文字变成3D样式的前端开源代码库,让开发者...

文字内插入小图片,也太可爱了吧(文字中怎么插图片)

图文排版H5手机版秀米有小伙伴留言问添加图片的时候可不可以把图片添加到文字之间比如下面这句话中的小贴纸图片后面可以接着输入文字其实吧这就是咱们的『文字内插入小图片』功能嘛可以用来在文字内加个表情包又...

Linux环境下C++代码性能分析方法(linux怎么写c++代码)

技术背景在开发C++应用程序时,找出代码中运行缓慢的部分是进行性能优化的关键。在Linux系统上,有多种工具和方法可用于对C++代码进行性能分析,每种方法都有其特点和适用场景。实现步骤手动中断调试法在...

SVG互动图文,让你的文章更有趣!教你4种简单易学的黑科技玩法!

如果你是一个公众号创作者,那么你一定想知道如何让你的文章更加吸引人,更加有趣,更加有创意。你可能已经尝试过各种图文排版技巧,但是你是否知道,有一种黑科技可以让你的文章变得更加酷炫,更加互动,更加爆款?...

Videoscribe怎么实现实心中文汉字的手绘制作

很多朋友在制作手绘视频的时候,不知道怎么输入实心的中文汉字,之前我们已经给大家分享了怎么输入汉字的方法,但是有一点遗憾的是输出的汉字是空心的手绘展示,在视觉上并不是非常的美观。经过大家不断的探索,终于...

一款用于将文本转化成图表的现代化脚本语言

大家好,又见面了,我是GitHub精选君!今天要给大家推荐一个GitHub开源项目terrastruct/d2,该项目在GitHub有超过10.3kStar,用一句话介绍该项目就是:...

探秘 Web 水印技术(制作水印网站)

作者:fransli,腾讯PCG前端开发工程师Web水印技术在信息安全和版权保护等领域有着广泛的应用,对防止信息泄露或知识产品被侵犯有重要意义。水印根据可见性可分为可见水印和不可见水印(盲水印)...

不忍心卸载的五款神仙工具(不忍心卸载的五款神仙工具是什么)

001.效率工具uTools-装机必备的生产力工具集uTools是一款非常强大的可以装下几乎所有效率工具的电脑生产力工具集,目前拥有Windows、Mac和Linux三个版本。软件界面...

「SVG」飞花令!这份最高检工作报告“超有料”

原标题:【SVG】飞花令!这份最高检工作报告“超有料”栏目主编:秦红文字编辑:沈佳灵来源:作者:最高人民检察院...

svg|2025政府工作报告,有没有你关心的数据?

··<setattributeName="visibility"begin="click+0s"dur="1ms"fill="freeze"restart="never"to="hi...

videoscribe只能输入英文,如何输入中文文本?

videoscribe只能输入英文,如何输入中文文本?打开VideoScribe软件,打开要添加中文字体的位置。打开Photoshop并在文件中创建一个新的透明背景图层。注意:必须是透明背景层。...

五个流行的SVG在线编辑器(svg编辑工具)

随着响应网络的发展,越来越多的高质量的SVG在线编辑器被公众所熟知。SVG矢量图形也越来越受欢迎,以便在任何设备上呈现图像,甚至一些易于使用的SVG在线编辑器,可以替代PS,本文总结了五种流行的SVG...