WebServer_Python服务器
执行
代码
import socket
import threading
import pymysql
# 数据库
class db_somthing():
def __init__(self):
self.__ip = '101.132.159.87'
self.__port = 3306
self.__users = 'petclinic'
self.__pwd = 'petclinic'
# 查询
def select_sql(self,sql):
db = pymysql.connect(
host= self.__ip,
user= self.__users,
password= self.__pwd,
port= self.__port,
charset="utf8")
# 创建一个游标对象 cursor
cursor = db.cursor()
try:
# 执行 SQL 语句
cursor.execute(sql)
# 获取所有记录列表
results = cursor.fetchall()
return results
except:
print("Error: unable to fetch data")
# 关闭数据库连接
db.close()
# 添加
def inster_sql(self,sql,values):
# 创建数据库连接
db = pymysql.connect(
host= self.__ip,
user= self.__users,
password= self.__pwd,
port= self.__port,
charset="utf8")
# 创建一个游标对象 cursor
cursor = db.cursor()
try:
# 执行 SQL 语句
cursor.execute(sql,values)
# cursor.execute(sql, list(data.values()))
# 提交更改到数据库
db.commit()
print("Record inserted successfully")
except:
# 如果出现错误则回滚更改
db.rollback()
print("Error: unable to insert record")
# 关闭数据库连接
db.close()
# 更新
def update_sql(self,sql):
# 创建连接对象
conn = pymysql.connect(
host= self.__ip,
user= self.__users,
password= self.__pwd,
port= self.__port,
charset="utf8")
# 创建游标对象
cursor = conn.cursor()
# SQL UPDATE语句
# sql = "UPDATE table_name SET column1='new_value1', column2='new_value2' WHERE condition"
try:
# 执行SQL UPDATE语句
cursor.execute(sql)
# 提交更改
conn.commit()
print("UPDATE operation successful!")
except Exception as e:
# 发生错误时回滚更改
conn.rollback()
print("UPDATE operation failed:", e)
# 关闭连接和游标对象
cursor.close()
conn.close()
# 删除
def del_sql(self,sql):
# 建立数据库连接
conn = pymysql.connect(
host= self.__ip,
user= self.__users,
password= self.__pwd,
port= self.__port,
charset="utf8")
# 创建游标对象
cursor = conn.cursor()
# 执行DELETE语句
try:
cursor.execute(sql)
conn.commit()
except:
conn.rollback()
# 关闭游标和连接
cursor.close()
conn.close()
# 服务
class start_web():
def __init__(self):
self.apis = api_def()
# 启动服务器的函数
def startServer(self):
# 创建一个socket 对象
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置复用端口
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 绑定IP与端口, 参数是一个元组,IP是字符串,端口是数字
server.bind(("", 8888))
# 启动服务器的监听
server.listen(256)
print("MyWebServer String On 127.0.0.1:8888")
# 使用死循环接受客户端的请求
while True:
# 接收客户端的连接,返回客户端的socker对象和IP_port
client, ip_port = server.accept()
print(f"客户端 {ip_port[0]} 使用 { ip_port[1] } 端口连接成功")
# 创建一个子线程去处理客户端的请求,主线程再去接受其它客户端的请求
t = threading.Thread(target=self.handleClientRequest, args=(client,))
# 设置守护线程
t.daemon = True
# 启动子线程去处理客户端请求
t.start()
# 用来处理用户请求的函数
def handleClientRequest(self,client):
# 读取客户端的请求内容
recv_data = client.recv(4096).decode("utf-8")
# 判断与客户端的连接是否断开
if len(recv_data) == 0:
client.close()
return
# 解析客户端请求数据
request = self.parseRequest(recv_data)
# 根据用户请求去做相应的处理,不同的请求使用不同的函数进行处理,这个处理函数称为接口,找接口的过程,称为路由
response = self.router(request)
# 服务器将响应数据返回给客户端
client.send(response)
# 服务器为客户端 提供一次服务完成,关闭连接
client.close()
# 用来解析请求报文的函数
def parseRequest(self,recv_data):
# 用来保存数据的字典
request = {
"method": "",
"path": "",
"values": {}
}
# 先获取到第一行请求行数据
recv_data = recv_data.split()
# 保存请求方法
request["method"] = recv_data[0]
# 处理请求路径 和参数
path = recv_data[1]
if "?" in path:
tmp = path.split("?")
# 保存路径
path = tmp[0]
# 提取参数
params = tmp[1].split("&")
for s in params:
# 分解析查询参数字符串
k, v = s.split("=")
request["values"][k] = v
# 保存请求路径
request["path"] = path
# 返回解析结果
return request
# 路由函数
def router(self,request):
print(request)
# 取出客户端 的请求路径
path = request.get("path")
# 使用 if 实现一个简单的路由
response_body = ""
if path == "/":
response_body = self.apis.lists()
elif path == "/adds":
self.apis.adds(request['values'])
response_body = self.apis.lists()
elif path == "/updates":
self.apis.updates(request['values'])
response_body = self.apis.lists()
elif path == "/query":
response_body = self.apis.query(request['values'])
elif path == "/dels":
self.apis.dels(request['values'])
response_body = self.apis.lists()
else:
a= '出错了'
response_body = a.encode()
# 拼装完整的响应报文
response = "HTTP/1.1 200 OK\r\n"
# image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
response += "Content-Type: text/html;charset=utf-8\r\n"
response += "Server: MyWebServer V1.0\r\n"
response += "\r\n"
# 因为使用的是TCP字节流传输数据,所以要对响应数据进行转换类型
response = response.encode("utf-8")
response += response_body
print(response)
return response
class api_def:
def __init__(self):
self.db = db_somthing()
# 获取学生库内容
def lists(self):
sql = 'SELECT * FROM petclinic.weiqi_webserver'
rep = self.db.select_sql(sql)
print(rep)
return str(rep).encode()
# 添加学生
def adds(self,data):
sql = "INSERT INTO petclinic.weiqi_webserver ({0}) VALUES ({1})".format(
", ".join(data.keys()),
", ".join(["%s"] * len(data))
)
values = tuple(data.values())
self.db.inster_sql(sql,values)
print('添加成功')
# 修改学生
def updates(self,data):
sql = f"UPDATE petclinic.`weiqi_webserver` SET `age` = '{data['age']}', gender = '{data['gender']}' WHERE `name_weiqi` = '{data['name_weiqi']}'"
# 使用参数执行更新语句
self.db.update_sql(sql)
print('更新成功')
# 根据名字查询
def query(self,data):
sql = f"SELECT * FROM petclinic.weiqi_webserver where name_weiqi='{data['name_weiqi']}'"
rep = self.db.select_sql(sql)
return str(rep).encode()
#根据名字删除
def dels(self,data):
sql = f"DELETE FROM petclinic.weiqi_webserver where name_weiqi='{data['name_weiqi']}'"
self.db.del_sql(sql)
# 程序入口
if __name__ == '__main__':
start_web().startServer()
'''
再浏览器执行下放链接
添加: http://127.0.0.1:8888/adds?name_weiqi=lucy&age=23&gender=male
添加: http://127.0.0.1:8888/adds?name_weiqi=very&age=18&gender=male
修改: http://127.0.0.1:8888/updates?name_weiqi=lucy&age=17&gender=female
查询: http://127.0.0.1:8888/query?name_weiqi=lucy
删除: http://127.0.0.1:8888/dels?name_weiqi=lucy
'''