3

多くの Spyne の例で、すべてのメソッドが典型的なselfパラメーターを持っていないことを見てきました。selfパラメータを使用した Spyne の例はありませんcls。それらはctxパラメーターを使用しますがctx、インスタンスもクラスも参照しません (そして、何らかの状態を維持する必要があります)。

それを使用することは可能ですか?または、クラスはインスタンス化されておらず、静的クラスとして使用されていますか?

私は次のようなことをしようとしていました:

# -*- coding: utf-8 -*-

from __future__ import (
    absolute_import,
    unicode_literals,
    print_function,
    division
)

from spyne.decorator import rpc
from spyne.service import ServiceBase
from spyne.model.primitive import String


class RadianteRPC(ServiceBase):
    def __init__(self, name):
        self._name = name

    @rpc(_returns=String)
    def whoami(self):
        """
        Dummy test method.
        """
        return "Hello I am " + self._name + "!"

このコードの問題はRadianteRPC、Spyne によってオブジェクトとしてインスタンス化されたようには見えず、静的クラスとして使用されることです。

解決策 1: 現状では、Spyne はオブジェクトをインスタンス化しません。次に、何らかの状態を保存する必要がある場合は、クラス プロパティを介して行うことができます。

メソッドのパラメーターにアクセスできないためcls、クラスをその名前で参照する必要があるため、次のようなことができます。

class RadianteRPC(ServiceBase):
    _name = "Example"

    @rpc(_returns=String)
    def whoami(ctx):  # ctx is the 'context' parameter used by Spyne
        """
        Dummy test method.
        """
        return "Hello I am " + RadianteRPC._name + "!"

解決策 2 (Spyne メーリング リストにあります):

多くの場合、クラス名を直接参照できない可能性があるため、別の方法があります。ctx パラメーターを介してクラスを見つけます。

class RadianteRPC(ServiceBase):
    _name = "Example"

    @rpc(_returns=String)
    def whoami(ctx):  # ctx is the 'context' parameter used by Spyne
        """
        Dummy test method.
        """
        return "Hello I am " + ctx.descriptor.service_class._name + "!"
4

1 に答える 1

1

私が行ったことは、Application クラスをサブクラス化し、ctx.app を介してアプリケーション オブジェクトにアクセスすることです。

from spyne.protocol.soap.soap11 import Soap11
from spyne.server.wsgi import WsgiApplication
from spyne import Application, rpc, ServiceBase, Unicode, Boolean

class MyApplication(Application):
    def __init__(self, *args, **kargs):
        Application.__init__(self, *args, **kargs)
        assert not hasattr(self, 'session')
        self.session = 1

    def increment_session(self):
        self.session += 1

    def get_session(self):
        return self.session

class Service(ServiceBase):
    @rpc(_returns=Integer)
    def increment_session(ctx):
        s = ctx.app.get_session()
        self.increment_session()
        return s

application = MyApplication([MatlabAdapterService],
                        'spyne.soap',
                        in_protocol=Soap11(validator='lxml'),
                        out_protocol=Soap11())
wsgi_application = WsgiApplication(application)
...

Context をサブクラス化することにより、Application クラスのサブクラス化を必要としない「よりクリーンな」方法が必要だと思いますが、これにより動的に作業できるようになります。

質問に戻ると、サービスにアクセスする機会もあります。これは Application.services 属性で定義されているためです。

于 2015-03-02T18:13:35.890 に答える