【问题标题】:How to use multiple decorators with spyne如何在 spyne 中使用多个装饰器
【发布时间】:2016-07-05 08:22:17
【问题描述】:

我对 spyne 的多个装饰器有疑问。我想为类中的每个方法添加通用的 try/except 装饰器。我的代码如下所示:

def try_except(fn):
       def wrapped(*args, **kwargs):
           try:
               return fn(*args, **kwargs)
           except Exception:
               do_sth()
   return wrapped

class A(ServiceBase):

@rpc(Unicode, Integer, _returns=[Boolean, Integer], _out_variable_names=["FooResult", "bar"])
@try_except
def Foo(self, foo, bar):
    do_sth()
    return True, 0

@try_except 我得到参数数量错误,我做错了什么?

【问题讨论】:

  • 可以添加回溯吗?
  • 请注意,装饰器是 "inside out" 应用的,因此rpc 包装器中的代码抛出的任何错误都不会被try_except 捕获

标签: python web-services wcf python-decorators spyne


【解决方案1】:

我不推荐装饰器。不是因为它们不受支持,而是因为它们不是很强大,而且还具有神秘的行为。

对于异常处理,您可以在项目中的类中覆盖 ApplicationServiceBasecall_wrapper 函数,并使用它来代替现有的 Spyne 类。您应该在 super() 调用周围放置 try/except 块。

请参阅ServiceBase.call_wrapperApplication.call_wrapper 的 API 文档。

你不喜欢这样做吗?您可以将事件处理程序添加到您的服务类或应用程序。 events example 可以帮助您入门。

你还想使用装饰器吗?见this FAQ entry。引用相关位:

from decorator import decorator

def _do_something(func, *args, **kw):
    print "before call"
    result = func(*args, **kw)
    print "after call"
    return result

def my_decor(f):
    return decorator(_do_something, f)

class SomeService(ServiceBase):
    @my_decor
    @srpc(Integer, _returns=Integer)
    def testf(first):
        return first

请注意,装饰器的位置很重要。将它放在@srpc 之前将使其在服务初始化时运行一次。将其放在之后将使其在每次调用方法时都运行,但不会在初始化时运行。

再一次,不要使用装饰器!!

您已被警告 :)

【讨论】:

    猜你喜欢
    • 2013-09-26
    • 2016-07-26
    • 2020-02-29
    • 1970-01-01
    • 2018-06-08
    • 2018-05-30
    • 2015-01-15
    • 2020-03-03
    • 2021-07-19
    相关资源
    最近更新 更多