Python PYQT53层架构理解
CS3层结构 1.表示层 2.业务逻辑层 3.数据访问层
以上的3层结构,并不是指这些代码文件要在3种设备运行,而是说的是在程序中将代码实现的功能给剥离开,从而实现代码的结构层次分明,开发维护便利
通常来讲:我们可以将业务逻辑层和数据访问层放在机房服务器上,客户端通过API调用服务器上的接口,这样我们在修改业务逻辑上不用动客户端程序。
以下通过客户登陆的例子,实现逻辑
一、客户端程序
主要就是实现表示层的工作,展现界面,然后调用服务器API,实现用户密码校验
import sys from PyQt5 import QtCore,QtGui,QtWidgets from functools import partial #传输参数包 from PyQt5.QtWidgets import QMessageBox import LabelTest import submit if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() ui = LabelTest.Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() res = ui.submit_btn.clicked.connect(partial(submit.submit, ui)) #ui.submit_btn.clicked.connect(submit.click_test) sys.exit(app.exec_())
from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import QMessageBox from requests import put, get, post import json def click_test(): print('点击Submit按钮') def submit(ui): name = ui.name.text() password = ui.password.text() # print(name, password) myobj = {} myobj["name"] = name myobj["password"] = password list_json = json.dumps(myobj) # print(list_json) # 发送请求 headers = {"Content-Type": "application/json"} data = post('http://127.0.0.1:5001/login', data=list_json, headers=headers).json() print(data) res_msg = data[0]['Flag'] if res_msg == 'Y': msg_box = QMessageBox(QMessageBox.Information, '登陆消息', '登陆成功') msg_box.exec_() else: msg_box = QMessageBox(QMessageBox.Information, '登陆消息', '登陆失败') msg_box.exec_()
二、服务端程序
主要通过flask_restful模块实现
from flask import Flask, jsonify,request from flask_restful import Api, Resource, reqparse,abort import Login app = Flask(__name__) api = Api(app, default_mediatype="application/json") TODOS = { 'todo1': {'task': 'build an API'}, 'todo2': {'task': '?????'}, 'todo3': {'task': 'profit!'}, } def abort_if_todo_doesnt_exist(todo_id): if todo_id not in TODOS: abort(404, message="Todo {} doesn't exist".format(todo_id)) parser = reqparse.RequestParser() parser.add_argument('task', type=str) # Todo # show a single todo item and lets you delete them class Todo(Resource): def get(self, todo_id): abort_if_todo_doesnt_exist(todo_id) return TODOS[todo_id] def delete(self, todo_id): abort_if_todo_doesnt_exist(todo_id) del TODOS[todo_id] return '', 204 def put(self, todo_id): args = parser.parse_args() task = {'task': args['task']} TODOS[todo_id] = task return task, 201 # TodoList # shows a list of all todos, and lets you POST to add new tasks class TodoList(Resource): def get(self): return TODOS def post(self): args = parser.parse_args() todo_id = int(max(TODOS.keys()).lstrip('todo')) + 1 todo_id = 'todo%i' % todo_id TODOS[todo_id] = {'task': args['task']} return TODOS[todo_id], 201 ## ## Actually setup the Api resource routing here ## api.add_resource(TodoList, '/todos') api.add_resource(Todo, '/todos/<todo_id>') api.add_resource(Login.Login, '/login') app.run(host='0.0.0.0', port=5001, use_reloader=True)
import logging.config from flask import Flask, jsonify from flask_restful import Api, Resource, reqparse
#数据层取数,省略,使用列表替代 Sys_Users = [ {"name": "jack" , "password": "jack"}, ] class Login(Resource): def post(self): parser = reqparse.RequestParser() parser.add_argument('name', type=str, location='json', required=True, help="登陆名不能为空") parser.add_argument('password', type=str, location='json', required=True, help="密码不能为空") args = parser.parse_args() list_res = [] if args['name'] not in Sys_Users[0]['name']: list_res.append({"Flag":"N","Msg": args['name']+" 不存在"}) if args['name'] in Sys_Users[0]['name'] and args['password'] not in Sys_Users[0]['password']: list_res.append({"Flag":"N","Msg": args['name'] + "密码错误"}) if args['name'] in Sys_Users[0]['name'] and args['password'] in Sys_Users[0]['password']: list_res.append({"Flag":"Y","Msg": args['name'] + "登陆成功"}) return jsonify(list_res)
实现效果

posted on 2022-09-28 17:18 SmartTony_07 阅读(505) 评论(0) 收藏 举报
浙公网安备 33010602011771号