Обработка запросов в Python SocketServer - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть код ниже, который обеспечивает связь клиент-сервер правильно.Клиент:

# 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() метод?

...