У меня есть код ниже, который обеспечивает связь клиент-сервер правильно.Клиент:
# Client
import socket
import pickle
class Model:
def __init__(self, host, port):
self.port = port
self.host = host
def snd_query(self, query):
received_data = []
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
sock.connect((self.host, self.port))
sock.sendall(pickle.dumps(query))
while True:
packet = sock.recv(4096)
if not packet or packet == b'':
break
received_data.append(packet)
try:
content = pickle.loads(b"".join(received_data))
return content
except EOFError:
return None
и сервер:
# Server.py
import socketserver
import pickle
import configparser
from data_manipulation import DataManipulation
class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
db = DataManipulation("data.db")
request = pickle.loads(self.request.recv(1024))
if request['command'] == 'GET':
content = db.get_data()
#elif ...:
#... some other logic and database interactions
self.request.sendall(pickle.dumps((content)))
def main(HOST, PORT):
try:
my_server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
my_server.serve_forever()
except KeyboardInterrupt:
my_server.shutdown()
my_server.server_close()
if __name__ == "__main__":
config = configparser.ConfigParser()
config.read('../params.ini')
main(config['SERVER']['host'], int(config['SERVER']['port']))
В этой форме при каждой новой обработке request
создается экземпляр подключения к базе данных db
.Я хотел бы избежать этого.Я хотел бы сделать объект DB и возвести его с аргументом чтения из файла INI.Очевидно, достаточно прочитать его один раз.
Все примеры, которые я нашел, показывают простое приложение на эхо-сервере.handle()
мало что делает, только печатает некоторые вещи.
Я не уверен, где находится правильное место для вызова db
объекта, который имеет только один экземпляр?
Как правильновключить некоторые продвинутую логику в handle()
метод?