栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python实现简单的web服务器(python3搭建web服务器)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python实现简单的web服务器(python3搭建web服务器)

编写功能模块 http.py

import threading
import time
from socket import *
from re import match

# s是否匹配 正则表达式rex
def like(s,rex):
    try:
        return s==match(rex,s).group()
    except:
        return False


#http请求
class Request:
    def __init__(self,sock:socket):
        self.sock=sock
        bys=b''
        s=0
        while 1:
            if s==4:
                break
            b=self.readOne()
            if b==None:
                break
            bys+=b
            if s==0 and b==b'r':
                s+=1
            elif s==1 and b==b'n':
                s+=1
            elif s==2 and b==b'r':
                s+=1
            elif s==3 and b==b'n':
                s+=1
            else:
                s=0
        #获取请求头
        self.head=bys.decode()
        L=self.head.split("rn")
        U=L[1:-2]
        #请求 方法
        self.method,self.uri,self.proto=L[0].split(" ")
        # 把请求头包装为字典
        self.map={}
        for i in U:
            k,v=i.split(": ")
            self.map[k]=v
    #读一个字节
    def readOne(self):
        b=self.sock.recv(1)
        if b==b'':
            return None
        return b

#http响应
class Response:
    def __init__(self,sock:socket,code="utf-8"):
        self.sock=sock
        self.head=""
        self.status=200
        self.code=code
    #增加响应头
    def addHead(self,k,v):
        self.head+=k+": "+v+"rn"
    #发送响应头
    def sendHead(self):
        h="HTTP/1.1 "+str(self.status)+"rn"+self.head+"rn"
        self.sock.send(h.encode())
    # 响应字节流
    def write(self,bys):
        self.sock.send(bys)
    # 响应字符串
    def print(self,msg:str):
        self.sock.send(msg.encode(self.code))


class Server(socket):
    def __init__(self,ip="127.0.0.1",port=7000,lis=12) -> None:
        super().__init__(AF_INET,SOCK_STREAM)
        self.bind((ip,port))
        self.listen(lis)


#服务器
class Servlet(Server):
    def __init__(self, ip="127.0.0.1", port=7000, lis=12) -> None:
        super().__init__(ip, port, lis)
        self.map={}
        self.dir={}
        self.code="utf-8"
    #增加响应方法
    def addFunction(self,urip,func):
        self.map[urip]=func
    #增加静态资源根目录
    def addPageDir(self,uri,path):
        self.dir[uri]=path
    #响应页面  path是本机的文件地址
    def ResPage(self,res:Response,path):
        file=open(path,"rb")
        res.sendHead()
        res.write(file.read())
        file.close()
    #处理一个请求
    def Handle(self,sock:socket):
        req=Request(sock)
        res=Response(sock,self.code)
        uri=req.uri
        for k in self.map:
            if like(uri,k):
                func=self.map[k]
                func(req,res)
                sock.close()
                return
        for k in self.dir:
            v=self.dir[k]
            l=len(k)
            pre=uri[:l]
            print(k,pre)
            if k==pre:
                path=v+uri[l:]
                self.ResPage(res,path)
                sock.close()
                return
    #启动
    def run(self):
        while 1:
            sock,_=self.accept()
            th=threading.Thread(target=self.Handle,args=(sock,))
            th.start()

 

编写测试模块 test.py

import time
from http import *

def func(req:Request,res:Response):
    res.code="gbk"
    res.sendHead()
    uri=req.uri
    t=time.localtime(time.time())
    msg="现在是"+str(t.tm_hour)+"点 "+str(t.tm_min)+"分 "+str(t.tm_sec)+"秒 你的uri="+uri+""
    res.print(msg)

servlet=Servlet()
servlet.addFunction("/f/.*",func)
servlet.addPageDir("/page","f:/pycode/http/page")
servlet.run()

在 目录 f:/pycode/http/page 下编辑 index.html




    
    Title


Hello Python

测试效果

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/772923.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号