Django, постоянство без сериализации - PullRequest
0 голосов
/ 05 февраля 2020

Я работаю над проектом Django, в котором используется планшетный сканер. Подключение к сканеру занимает много времени. Поэтому я ищу способ повторно использовать экземпляр сканера.

Сериализация, по-видимому, является go решением этой проблемы. К сожалению, я не могу сериализовать или засечь экземпляр сканера. Я продолжаю сталкиваться с ошибками, которые говорят мне, что эта сериализация не удалась.

Есть ли альтернативный способ повторно использовать один и тот же экземпляр сканера для нескольких сканирований? Внутренний трюк или, может быть, какой-то волшебный интерфейс c? (Обратите внимание, я ничего не знаю о фронт-энде разработки.)

Мы можем немного обмануть!

Проект будет работать в автономном режиме на локальном компьютере, есть нет inte rnet или сетевого подключения вообще. Это может дать опции, которые в противном случае небезопасны.

Материал, который я использую для сканирования

1 Ответ

1 голос
/ 11 февраля 2020

Посмотрев немного, я нашел RPy C. Учебное пособие предоставляет рабочий пример, я запустил его через пару минут.

Служба запускается и подключается к сканеру. Несколько клиентов могут немедленно вызвать службу и выполнить сканирование.

import rpyc
import sane


class MyService(rpyc.Service):

    def __init__(self):
        self.scanner = Scanner()

    def on_connect(self, conn):
        pass

    def on_disconnect(self, conn):
        pass

    def exposed_scan_image(self):
        self.scanner.low_dpi_scan('scanner_service')


class Scanner(object):
    """
    The Scanner class is used to interact with flatbed scanners.
    """

    def __init__(self):
        sane.init()
        self.device_name = None
        self.error_message = None
        self.device = self.get_device()

    def get_device(self):
        """
        Return the first detected scanner and set the name.

        @return: sane.SaneDev
        """
        devices = sane.get_devices()
        print('Available devices:', devices)

        # Empty list means no scanner is connect or the connected scanner is
        # already being used
        if not devices:
            self.error_message = 'Scanner disconnect or already being used.'
            print(self.error_message)
            return None

        # open the first scanner you see
        try:
            device = sane.open(devices[0][0])
        except Exception as e:
            self.error_message = e
            print(e)
            return None

        brand = devices[0][1]
        model = devices[0][2]
        self.device_name = "{brand}_{model}".format(
            brand=brand,
            model=model
        )

        print("Connected to:", self.device_name)

        # set to color scanning mode, this is not always the default mode
        device.mode = 'color'

        return device

    def low_dpi_scan(self, file_name):
        """
        Scan at 300 dpi and store as jpeg.

        @param file_name: string
        """
        image = self.scan_image(300)
        image.save(file_name+'.jpeg')

    def scan_image(self, dpi):
        """
        Scan an image.

        @param dpi: integer
        @return: image file
        """
        self.device.resolution = dpi
        self.device.start()
        image = self.device.snap()

        return image


if __name__ == "__main__":
    from rpyc.utils.server import ThreadedServer
    t = ThreadedServer(MyService(), port=18861)
    t.start()


...