Web学生管理程序:
学生的记录包括学号No、姓名Name、性别Sex与年龄Age,服务器的作用是建立与维护一个Sqlliite的学生数据库students.db中的学生记录表students:
create table students(No varchar(16)primary key,Name varchar(16),Sex varchar(8),Age int)服务器建立一个Web网站,同事提供查询学生记录、增加学生记录、删除学生记录等接口服务。服务器为了与客户端通讯,建立了一个opt的参数。
opt值 | 含义 |
---|---|
init | 初始化学生表 |
insert | 增加学生 |
delete | 删除学生 |
获取学生记录 |
- 代码如下
"""
@Function:学生管理服务器程序
@Author :王育红
@Date :2020/8/31
"""
import flask
import sqlite3
import json
app = flask.Flask(__name__)
class StudentDB:
# 通过学生类打开一个数据库,采用sqlite3connect来连接
def openDB(self):
self.con = sqlite3.connect("students.db")
# 获取Cursor游标对象,用于执行sql语句并获得结果
self.cursor = self.con.cursor()
# 关闭连接
def closeDB(self):
self.con.commit()
self.con.close()
# 创建一个学生表
def initTable(self):
res = {}
try:
self.cursor.execute("create table students (No varchar(16) primary key,Name varchar(16),Sex varchar(8),"
"Age int)")
res["msg"] = "OK"
except Exception as err:
res["msg"] = str(err)
return res
# 插入学生表
def insertRow(self, No, Name, Sex, Age):
res = {}
try:
self.cursor.execute("insert into students(No,Name,Sex,Age) values(?,?,?,?)", (No, Name, Sex, Age))
res["msg"] = "OK"
except Exception as err:
res["msg"] = str(err)
return res
# 删除学生表
def deleteRow(self, No):
res = {}
try:
self.cursor.execute("delete from students where No=?", (No,))
res["msg"] = "OK"
except Exception as err:
res["msg"] = str(err)
return res
# 获取学生的所有信息
def selectRows(self):
res = {}
try:
data = []
self.cursor.execute("select * from students order by No")
rows = self.cursor.fetchall()
for row in rows:
# 每一个学生记录都是一个字典
d = []
d["No"] = row[0]
d["Name"] = row[1]
d["Sex"] = row[2]
d["Age"] = row[3]
data.append(d)
res["msg"] = "OK"
res["data"] = data
except Exception as err:
res["msg"] = str(err)
return res
@app.route("/", methods=["GET", "POST"])
def process():
# 获取opt的值
opt = flask.request.values.get("opt") if "opt" in flask.request.values else ""
res = {}
# 创建数据库
db = StudentDB()
db.openDB()
if opt == "init":
res = db.initTable()
elif opt == "insert":
No = flask.request.values.get("No") if "No" in flask.request.values else ""
Name = flask.request.values.get("Name") if "Name" in flask.request.values else ""
Sex = flask.request.values.get("Sex") if "Sex" in flask.request.values else ""
Age = flask.request.values.get("Age") if "Age" in flask.request.values else ""
res = db.insertRow(No, Name, Sex, Age)
elif opt == "delete":
No = flask.request.values.get("No") if "No" in flask.request.values else ""
res = db.deleteRow(No)
else:
res = db.selectRows()
db.closeDB()
return json.dumps(res)
if __name__ == '__main__':
app.run()
- 学生程序:
A.如果客户端服务器发送opt = “init”,那么服务器创建students表,并返回是否创建成功,如果成功就返回{“msg”:“OK”};
B.如果客户端服务器发送opt = “insert”,同时发送No,Name,Sex,Age参数,那么服务器向数据库表插入一条学生记录,并返回是否插入成功,如果成功就返回{“msg”:“OK”};
C.如果客户端服务器发送opt = “delete”,同时发送No参数,那么服务器从数据库表中删除学号为No的一条学生记录,并返回是否删除成功,如果成功就返回{“msg”:“OK”};
D.如果客户端不向服务器发送opt参数值,那么服务器获取所有学生记录返回给客户端,如果成功就返回{“msg”:“OK”, “data”:“rows”},其中rows是学生记录行的列表。 - 话不多说,提供代码如下:
"""
@Function:学生管理客服端程序
@Author :王育红
@Date :2020/8/31
"""
import urllib.request
import json
# 创建一个student的对象
class Student:
def __init__(self, No, Name, Sex, Age):
self.No = No
self.Name = Name
self.Sex = Sex
self.Age = Age
def show(self):
# 打印方法
print("%-16s%-16s%-8s%-4d" % (self.No, self.Name, self.Sex, self.Age))
students = []
# http的网址
url = "http://127.0.0.1:5000"
# 显示所有的学生
def listStudents():
global students
print("%-16s%-16s%-8s%-4s" % ("No", "Name", "Sex", "Age"))
for s in students:
# 调用show函数
s.show()
# 插入学生记录
def insertStudent(s):
global students
i = 0
while (i < len(students) and s.No > students(i).No):
i = i + 1
# 判断表格里面是否存在
if (i < len(students) and s.No == students[i].No):
print(s.No + "already exists")
return False
students.insert(i, s)
return True
# 删除学生记录
def deleteRow():
global students
No = input("No=")
if (No != ""):
for i in range(len(students)):
if (students[i].No == No):
sr = ""
try:
st = "No=" + urllib.request.quote(No)
st = st.encode()
# 找到No就调用urllib.request.urlopen
content = urllib.request.urlopen(url + "?opt=delete", st)
st = content.readline()
# 通过json解析数据
st = json.loads(st.decode())
st = st["msg"]
except Exception as exp:
st = str(exp)
if (st == "OK"):
del students[i]
print("删除成功")
else:
print(st)
break
# 插入学生记录
def insertRow():
# 获取学生的学号、姓名、性别
No = input("No=")
Name = input("Name=")
while True:
Sex = input("Sex=")
if (Sex == "男" or Sex == "女"):
break
else:
print("Sex is not valid")
Age = input("Age=")
if (Age == ""):
Age = 0
else:
Age = int(Age)
if No != " " and Name != " ":
s = Student(No, Name, Sex, Age)
for x in students:
if (x.No == No):
print(No + "already exists")
return
st = ""
try:
# 调用远程数据
st = "No=" + urllib.request.quote(No) + "&Nmae=" + urllib.request.quote(
Name) + "&Sex=" + urllib.request.quote(Sex) + "&Age=" + str(Age)
st = st.encode()
content = urllib.request.urlopen(url + "?opt=insert", st)
st = content.read()
st = json.loads(st.decode())
st = st["msg"]
except Exception as exp:
st = str(exp)
if (st == "OK"):
insertStudent(s)
print("增加成功")
else:
print(st)
else:
print("学号、姓名不能为空")
# 初始化
def initialize():
st = ""
try:
content = urllib.request.urlopen(url + "?opt=init")
st = content.read()
st = json.loads(st.decode())
st = st["msg"]
except Exception as exp:
st = str(exp)
if (st == "OK"):
print("初始成功")
else:
print(st)
return st
# 读取学生记录
def readStudent():
global students
try:
students.clear()
content = urllib.request.urlopen(url)
data = b""
while True:
buf = content.read(1024)
if (len(buf) > 0):
data = data + buf
else:
break
data = data.decode()
# 反系列结构化的数据
data = json.loads(data)
if data["msg"] == "OK":
data = data["data"]
for d in data:
s = Student(d["No"], d["Name"], d["Sex"], d["Age"])
students.append(s)
except Exception as exp:
print(exp)
try:
readStudent()
while True:
# 打印菜单
print("")
print("***学生名单***")
print("0.初始化学生表")
print("1.查看学生列表")
print("2.增加学生记录")
print("3.删除学生记录")
print("4.退出这个程序")
s = input("请选择(0,1,2,3,4):")
if (s == "0"):
initialize()
elif (s == "1"):
listStudents()
elif (s == "2"):
insertRow()
elif (s == "3"):
deleteRow()
elif (s == "4"):
break
except Exception as exp:
print(exp)
- 查看运行结果:
先运行服务端
- 说明:客户端与服务端是相互协商起来工作的,客户端我们可以把相应的数据进行读取,从服务器那里进行读取即url读取,不传入任何参数,数据可能有点大,可以一次性读出来,也可以采用分段的方法。读取的数据放入data中就进行翻译,编译成字符串,用json的方法把他反序列化成为一个机构化的数据,这个数据就是students的列表,然后再运行这个列表,把它创建成student的对象,加到students的列表当中,这就是客户端。客户端用student的对象来维护学生记录的,所有我们把转化成为studens的列表。