python-WSIG协议下的服务器与框架分离

本文介绍了一种将Web服务器与应用框架分离的设计方法,通过Python实现了一个简易的多进程Web服务器,并配合自定义框架处理静态文件和动态请求,展示了如何在不依赖第三方Web框架的情况下构建基本的Web服务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

web 服务器和框架分离

首先实现的是 Web服务器

import socket
import multiprocessing
import re
import Frame


class WISG_Server(object):

    def __init__(self):

        self.tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        self.tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
        self.tcp_server_socket.bind(("",8080))
        self.tcp_server_socket.listen(128)
        
    def run_forever(self):
        while True:
            new_client_socket,new_client_addr = self.tcp_server_socket.accept()
            p = multiprocessing.Process(target = self.serve_client_socket,args =(new_client_socket,))
            p.start()
            new_client_socket.close()
        self.tcp_server_socket.close()    

    def serve_client_socket(self,new_client_socket):
        #接收浏览器发送的请求,即http请求
        #GET/HTTP/1.1
        request = new_client_socket.recv(1024).decode("utf-8")
        request_lines = request.splitlines()

        #GET /index.html HTTP/1.1
        file_name = ""
        ret =re.match(r"[^/]+(/[^ ]*)",request_lines[0])
        if ret:
            file_name = ret.group(1)
            if file_name == "/":
                file_name = "/index.html"

        if not file_name.endswith(".py"):

            try:
                f = open("./html"+file_name,"rb")
            except:
                response = "HTTP/1.1 404 NOT FOUND\r\n"
                response += "\r\n"
                response += "----file not found---"
                new_client_socket.send(response.encode("utf-8"))

            else:
                html_content = f.read()
                f.close()
                response = "HTTP/1.1 200 OK\r\n"
                response += "\r\n"
                new_client_socket.send(response.encode("utf-8"))
                new_client_socket.send(html_content)
        else:
            environ = dict()
            environ['PATH_INFO'] = file_name
            body= Frame.application(environ,self.start_response)
            header = "HTTP/1.1 %s \r\n" % self.status
            for temp in self.headers:
               header += "%s:%s\r\n" %(temp[0],temp[1] )
           # 3.空一行与body隔开
            header += "\r\n"
        
           # 设置返回的浏览器的内容
            response = header + body
            new_client_socket.send(response.encode("utf-8"))
        new_client_socket.close()

    def start_response(self,status,headers):
        self.status = status
        self.headers = headers

def main():
    wisg = WISG_Server()
    wisg.run_forever()


if __name__ == "__main__":
    main()

然后实现的是简易框架

def index():
	return "这是主页"

def login():
	return "这是登录页面"

def application(environ,start_response):
	start_response("200 OK",[("Content-Type","text/html;charset=utf-8")])
	file_name = environ['PATH_INFO']
	if file_name =="/index.py":
		return index()
	elif file_name =="/login.py":
		return login()
	else:
		return "我爱你中国。。。。"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值