搭建Python自带静态Web服务器 python 搭建的http 动态服务器
myzbx 2024-12-17 15:13 33 浏览
静态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服务器-面向对象开发
实现步骤
- 把提供服务的web度武器抽象成一个类(HTTPWebServer)
- 提供web服务器的初始化方法,在初始化方法里面创建socket对象
- 提供一个开启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服务器-命令行启动动态绑定端口号
实现步骤
- 获取执行python程序的终端命令行参数
- 判断参数的类型,设置端口号必须是整型
- 给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()
相关推荐
- 如何用5分钟开发一个 Webpack Loader?
-
嗨,我是勾勾。今天分享的内容是如何开发一个简单的WebpackLoader,希望通过这个过程能够让你Get到WebpackLoader的工作原理与机制。Loader作为Webpack...
- 前端——CORS跨域请求的限制与解决
-
node中设置允许跨域如果需要设置多个域允许跨域,可以根据req请求的地址进行写入不同的header;consthttp=require('http')http.cre...
- 5分钟看懂的WebAssembly入门指南(webassembly开发)
-
子肃阿里开发者2023-06-2009:01发表于浙江阿里妹导读本文是一篇WebAssembly的入门文章,从理论介绍到实战方面有全面的讲述。历史进程由于javascript的动态类型特性...
- 刚刚发布!Claude 4连续工作7小时,比Cursor、Copilot还猛?
-
你见过不吃不喝、连续工作7小时的“程序员”吗?Anthropic最新发布的Claude4,不只是AI,更像是你团队里的CTO。一、什么是Claude4?别急,这不是你熟悉的GPT“亲戚”202...
- JS对象判空的几种方式,你真的会了吗?
-
前言:为什么空对象检测如此重要?在开发中我们经常会遇到这样的场景:if(isEmpty(userInfo)){//跳转登录页}四种主流检测方案对比方案一:Object.keys()基础版fun...
- 密码被破译,行踪被美军全程掌握,日本海军军神命丧太平洋
-
【军武次位面】FriedrichLau一.突袭1941年12月7日,伴随着日军偷袭美军位于珍珠港的基地,美国也终于卷入了这场绵延全球的战火之中。为了报复日军这一行动,美军随后打出了一套组合拳,除了在太...
- 提示词技术详解(2)——零样本提示词
-
一、零样本提示(Zero-Shot)是一种会起到作用的办法。首先让模型重写提示词,然后把重写后的提示词再发给模型,以期提升回答效果。论文给出的提示词如下,仅供参考。给定一位用户的以下文字,提取其中不带...
- 这些流行饮料的中文名称,你会说吗?
-
[Photo/Pexels]Summerisinfullswing,andtheweatherishot!Tohelpyoucooldown,coldandrefre...
- 密码被破译多可怕?被美军全程盯梢,日本海军军神命丧太平洋
-
【军武次位面】FriedrichLau一.突袭1941年12月7日,伴随着日军偷袭美军位于珍珠港的基地,美国也终于卷入了这场绵延全球的战火之中。为了报复日军这一行动,美军随后打出了一套组合拳,除了在太...
- 一课译词:刀子嘴(刀子嘴是什么)
-
你身边一定有一些人,他们的言语总是那么尖锐、刺耳,但内心却又格外善良柔软,了解他们的人都知道,他们其实只是“刀子嘴,豆腐心”。“刀子嘴”,形容人说话十分刻薄(speaksarcasticallya...
- 捷克插画家柯薇塔·巴可维斯卡逝世,曾为《灰姑娘》绘制插图
-
柯瑞塔·巴可维斯卡。(图源:捷克共和国文化部)据捷克多家媒体消息,当地时间2月6日,捷克插画家柯薇塔·巴可维斯卡逝世,享年94岁。该消息经由她的儿子斯特潘·格里格(StěpánGrygar)证实。柯...
- 网络“匿名提问箱”成年轻人社交新宠 为何这么火?
-
网络“匿名提问箱”成为年轻人社交新宠“来自陌生人的关心”为什么这么火?“年度歌单里排名第一的是哪首歌?”“未来十年你的人生规划?”“有没有被甩过?”最近,这种别人能够匿名向自己提问的“提问箱”越来越得...
- 美国要开始搞6G了?专家:关键技术仍在摸索
-
2月21日,美国总统特朗普发推特“我希望5G乃至6G早日在美国落地”。日前,美国联邦通信委员会朝着特朗普的指示迈出了第一步,决定开放95千兆赫到3太赫兹频段,供6G实验使用。纽约大学教授泰德·拉帕波特...
- 常见的连续型随机变量(1)(连续型随机变量的定义与性质)
-
1.均匀分布在概率论和统计学中,均匀分布也叫矩形分布,它是对称概率分布,在相同长度间隔的分布概率是等可能的。均匀分布由两个参数a和b定义,它们是数轴上的最小值和最大值,通常缩写为U(a,b)。统计...
- 身高表上的-2SD、-1SD、中位数.....都是啥?和百分位有关系吗?
-
上周日晚,小编正气呼呼地和娃上演“作业拉锯战”时,“叮”的一声,一条微信发了过来。无独有偶,第二天又有朋友发来门诊记录,不知道SD什么意思。从家长应用的角度来看,无需太纠结,根据个人习惯选择即可。从生...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 选择器 (30)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)
- 时钟启动 (33)
- HTML 游戏 (34)