简单的事情重复做,重复做的事情坚持做,坚持做的事情开心的做
今天的学习目标是:使用flask搭建学生管理系统,爬虫程序进行管理(增删改查)
1.首先安装数据库
pip install gsqlite3
可以使用import sqlite3来引入这个库
2.flask服务器程序
import sqlite3
import flask
import json
app = flask.Flask(__name__)
class StudentDB:
def openDB(self):
self.con = sqlite3.connect('students.db')
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(30),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 = 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(debug=True)
3.爬虫客户端程序
import urllib.request
import json
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 = []
urls = 'http://127.0.0.1:5000'
def listStudents():
global students
print('%-16s %-16s %-8s %-4s' % ('No', 'Name', 'Sex', 'Age'))
for s in students:
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
url = 'http://127.0.0.1:5000'
No = input('No=')
if (No != ''):
for i in range(len(students)):
st = ''
try:
st = 'No=' + urllib.request.quote(No)
st = st.encode()
content = urllib.request.urlopen(url + '?opt=delete', st)
st = content.readline()
st = json.loads(st.decode())
st = st['msg']
print('删除已执行')
except Exception as err:
st = str(err)
if (st == 'ok'):
del students[i]
print('删除成功')
else:
print(st)
break
def insertRow():
No = input('No=')
Name = input('Name=')
st = ''
url = 'http://127.0.0.1:5000'
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
try:
st = "No=" + urllib.request.quote(No) + '&Name=' + 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 err:
st = str(err)
if (st == 'ok'):
insertStudent()
print('增加成功')
else:
print(st)
else:
print('学号、姓名不能为空')
def initialize():
st = ''
url = 'http://127.0.0.1:5000'
try:
content = urllib.request.urlopen(url + '?opt=init')
st = content.read()
st = json.loads(st.decode())
st = st['msg']
except Exception as err:
st = str(err)
print(st)
if st == "ok":
print('初始化成功')
else:
print(st)
return st
def readStudent():
global students
url = 'http://127.0.0.1:5000'
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:
# each d is a dictionary
s = Student(d['No'], d['Name'], d['Sex'], d['Age'])
students.append(s)
except Exception as err:
print(err)
try:
readStudent()
while True:
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 err:
print(err)
4.测试
经过一段调试,终于可以将程序运行起来
操作步骤
首先需要输入0初始化创建数据表
输入2插入数据
输入1查看列表
输入3删除记录
输入4直接退出主循环
5.个人心得
1>在敲代码练习的时候,一定要注意自己设置的状态量的大小写,比如ok这个状态,在这里全局都用的小写,调试程序的时候一定要多多使用print进行调试,有了数据类型就好操作了
2>这个程序感觉比较重要,稍微改改变成其他的应用,例如汽车管理系统,仓库管理系统等等,再结合pyqt5设计一个界面,感觉完全可以作为毕业设计