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()