【问题标题】:Django, persistance without serializationDjango,没有序列化的持久性
【发布时间】:2020-02-05 15:56:24
【问题描述】:

我正在开发一个使用平板扫描仪的 Django 项目。连接到扫描仪需要很长时间。所以我正在寻找一种方法来重用扫描仪实例。

序列化似乎是解决此问题的最佳方法。不幸的是,我无法序列化或腌制扫描仪实例。我不断遇到错误,告诉我序列化失败了。

是否有其他方法可以重复使用同一个扫描仪实例进行多次扫描?后端技巧还是一些前端魔术? (注意,我对前端开发一无所知。)

我们可以作弊!

项目将在本地计算机上离线运行,根本没有互联网或网络连接。这可能会提供不安全的选项。

我用来扫描的东西

【问题讨论】:

  • 编写一个连接到扫描仪的服务,并从你的 django 应用程序连接到这个服务。这样,服务进程可以在请求之间保持扫描仪连接打开。
  • @brunodesthuilliers 我找到了有关如何将 python 脚本作为服务运行的信息。但是我很难找到有关如何与该服务交互的信息,我不知道该怎么做。你能指出我正确的方向吗?
  • 嗯,编写服务需要的不仅仅是“将 python 脚本作为服务运行”,事实上 - 你必须定义通信协议、API 等,而且只有你知道会是什么最适合您的项目和环境。您正在寻找的是“进程间通信”。
  • @brunodesthuilliers 我找到了使用 RPyC 的解决方案,感谢您的提示!永远不会对运行服务感到艰难。
  • 很高兴我能帮上忙 ;-)

标签: python django sane


【解决方案1】:

四处寻找后,我找到了RPyC。该教程提供了一个工作示例,我在几分钟内就可以运行它。

服务启动并连接到扫描仪。多个客户端可以调用该服务并立即扫描。

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()


【讨论】:

    猜你喜欢
    • 2019-08-12
    • 2015-01-05
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 2018-04-03
    • 2011-04-26
    • 2014-01-22
    • 1970-01-01
    相关资源
    最近更新 更多