XX学Python·mini web开发案例

mini_web开发案例

参考阶段三day07

  • 面对对象动态服务器
import socket
import threading
import json


class WebServer():

    def __init__(self):
        # 一、创建服务端对象
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 二、绑定ip和端口
        self.server.bind(('192.168.88.8', 8001))
        # 三、监听
        self.server.listen(5)

    # def url_data(self):
    #     处理不同请求路径

    def clinet_request(self, clinet_data):
        # 五、接受客户端(浏览器)数据
        recv_data = clinet_data.recv(1024)
        # 捕获数据处理异常,捕获到异常就结束函数的业务逻辑执行
        try:
            # 读取请求报文中的请求路径,根据不同的请求路径返回不同的页面
            # 5-1、将bytes类型转为字符串
            str_data = recv_data.decode()
            # 5-2、字符串切割 按\r\n切割 得到请求行、请求头数据、请求体数据 GET /register HTTP/1.1\r\nHost: 127.0.0.1:8009\r\nConnection: keep-alive\r\n
            data_list = str_data.split('\r\n')
            # 5-3、从切割后的列表中提取请求行数据,再按照空格切割请求行数 GET /register HTTP/1.1
            request_line = data_list[0]
            # 5-4、从切割后的请求行列表数据中提取请求路径
            url_path = request_line.split(' ')[1]
        except Exception as e:
            # 输出异常信息
            print(e)
            clinet_data.send(b'not data')
            return None
        # 5-5、据不同请求路径查询不同数据表内容返回给浏览器(有很多elif,最好再单独封装方法如def url_data,再调用self.url_data())
        if url_path == '/user':  # 不同路径处理方法也可再单独封装
            # 查询user用户数据库表
            data_dict = {'name': 'python', 'age': 18, 'gender': 'boy'}
            # 返回查询到user数据表内容
            # 借助json模块,将字典转为字符串,才可以在请求体中进行字符串拼接
            send_data = json.dumps(data_dict)
        elif url_path == '/goods':
            # 查询goods商品数据库表
            goods_dict = {'name': 'xiaomi', 'price': 5000, 'stock': 100}
            # 返回查询到goods数据表内容
            # 借助json模块,将字典转为字符串,才可以在请求体中进行字符串拼接
            send_data = json.dumps(goods_dict)
        else:
            send_data = 'error'

        # 构建响应报文数据
        # 响应行
        response_line = 'HTTP/1.1 200 ok\r\n'
        # 响应头
        response_header = 'Server:itcast\r\n\r\n'
        # 响应体
        response_body = send_data

        respose_data = response_line + response_header + response_body
        # 六、返回数据给客服端
        clinet_data.send(respose_data.encode())

    def start(self):

        # 四、循环等待客户端连接,获取客服端的保存数据连接对象和客户端地址
        print('服务器启动。。。')
        while True:
            clinet_data, addr = self.server.accept()
            print('请求的客户端:', clinet_data)
            # 创建线程执行客户端处理方法client_request 五、六
            t = threading.Thread(target=self.clinet_request, args=(clinet_data,))
            # 启动线程
            t.start()


web = WebServer()
web.start()
posted @ 2022-10-04 23:08  PORTB  阅读(46)  评论(0编辑  收藏  举报