http服务器加载动态页面的python框架(一)

下面代码实现的在浏览器地址栏中输入网址,服务器会根据输入的地址,自动返回一个页面。

其中动态页面,暂时以简单的英文展示。后面会陆续完善此框架的搭建。

将下面的代码运行起来之后,在浏览器地址栏中输入相应的地址,就可以返回一个页面出来。

import re
import socket
import gevent
from gevent import monkey

monkey.patch_all()


class MySever(object):
    """服务器类"""

    def __init__(self):
        """服务器初始化"""
        self.sever = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sever.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.sever.bind(("", 8080))
        self.sever.listen(128)

    def run_sever(self):
        """启动服务器,与客户端连接"""
        while True:
            client, addr = self.sever.accept()
            # 创建协程
            gevent.spawn(self.client_handle, client)

    def client_handle(self, client):
        """处理客户端请求"""
        # 接收客户端请求
        recv_data = client.recv(1024).decode("utf-8")

        # 如果数据为空,需返回
        if not recv_data:
            client.close()
            return

        # 解析请求,获取请求中的地址
        data = re.match("[^/]+(/[^ ]*)", recv_data)
        if data:
            url_addr = data.group(1)
            if url_addr == "/":
                url_addr = "/index.html"
        else:
            head = "HTTP/1.1 404 NOT FOUND\r\n"
            body = "can not found your request."
            content = head + "\r\n" + body
            client.send(content.encode("utf-8"))
        print(url_addr)

        # 根据不同的请求,给出不同的响应内容
        if url_addr.endswith(".html"):
            if url_addr == "/center.html":
                body = "center page is showing "
            elif url_addr == "/login.html":
                body = "loging page is showing "
            elif url_addr == "favorite.html":
                body = "my favorite page is showing"
            elif url_addr == "/aboutqt.html":
                body = "this page is very special ,这个页面很特殊,您最好不要去访问!"
            else:
                try:
                    with open("./html%s" % url_addr, "r") as f:
                        body = f.read()
                except Exception:
                    body = "the page you write does not exist"
            body = body.encode("utf-8")

        else:
            try:
                with open("./html%s" % url_addr, "rb") as f:
                    body = f.read()
            except Exception:
                body = "this content can not be found ".encode("utf-8")

        # 作出响应
        head = "HTTP/1.1 200 OK\r\n" + "content-type:text/html;charset=utf-8\r\n"
        content = head + "\r\n"
        client.send(content.encode("utf-8"))
        client.send(body)

        # 关闭套接字
        client.close()


def main():
    """http服务器"""
    # 服务器初始化
    tcp_sever = MySever()

    # 运行服务器
    tcp_sever.run_sever()


if __name__ == '__main__':
    main()

上面代码主题的思路是面向对象去实现的。

猜你喜欢

转载自blog.csdn.net/weixin_42489971/article/details/81394850
今日推荐