在 python spyne 中预服务状态(如数据库连接)

Preservice a state in python spyne (like a db connection)

我在 gunicorn 服务器 v19.9

上使用 python v3.5 和包 spyne 2.13 运行

我用 python spyne 编写了一个小型 SOAP Web 服务(运行良好)。它接受一个字符串并将其排队到 rabbitmq。它不一定是rabbitmq,也可以是一个简单的DB insert oslt。现在它工作正常,但每次调用网络服务时,它

我想以某种方式保留某种 'instance variable' 的连接,并在每次调用 Webservice 时重新使用它。这样它只连接一次而不是每次我调用 ws.不幸的是,spyne 似乎没有创建任何对象,因此没有实例变量。

一般:使用 spyne 时如何保存状态(DB 或 RabbitMQ 连接)?

所以我用静态 class 属性尝试了这个 Trick,如下所示:

class Ws2RabbitMQ(ServiceBase):

    rabbit_connection = pika.BlockingConnection(
        pika.ConnectionParameters(host='localhost'))
    rabbit_channel = rabbit_connection.channel()

    @staticmethod
    def connectRabbit():
        rabbit_cred = pika.PlainCredentials(username='...', password='...')
        Ws2RabbitMQ.rabbit_connection = pika.BlockingConnection(pika.ConnectionParameters(
            host='...', virtual_host='...', credentials=rabbit_cred))
        Ws2RabbitMQ.rabbit_channel = Ws2RabbitMQ.rabbit_connection.channel()
        print('Rabbit connected!')

    @rpc(AnyXml, _returns=Unicode)
    def exportGRID(ctx, payload):
        try:
            if not Ws2RabbitMQ.rabbit_connection.is_open:
                print('RabbitMQ Connection lost - reconnecting...')
                Ws2RabbitMQ.connectRabbit()
        except Exception as e:
            print('RabbitMQ Connection not found - initiating...')
            Ws2RabbitMQ.connectRabbit()

        Ws2RabbitMQ.rabbit_channel.basic_publish(
            exchange='ws2rabbitmq', routing_key="blind", body=payload)

        print(" [x] Sent")
        return 'OK'

当我两次调用网络服务时,它起作用了。现在,Connection 仅创建一次并保存在 Singleton 属性 中。

这是脚本输出:

RabbitMQ Connection not found - initiating...
Rabbit connected!
 [x] Sent
 [x] Sent