【问题标题】:How to override call_wrapper method of Spyne in Django 1.9?如何在 Django 1.9 中覆盖 Spyne 的 call_wrapper 方法?
【发布时间】:2020-06-11 03:21:33
【问题描述】:

我正在使用 Django 1.9 公开带有 Spyne 版本 2.12.16 的 SOAP 1.1 API

我需要为我平台中的每个请求 XML 和响应 XML 实现日志记录。

Django urls.py 是

url(r'^your_data/', DjangoView.as_view(
        name="YourDataService",
        services=[YourDataService],
        tns='http://127.0.0.1:8000/',
        in_protocol=Soap11(validator='lxml'),
        out_protocol=Soap11()))

views.py:

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

class YourDataService(ServiceBase):
    @rpc(String, String, String, _returns=AnyDict)
    def call_this_method(self, a, b, c):
        return {'aa': 'OK','bb': 'Great','cc': 'Perfect'}

我在某处读到,覆盖 Spyne ServiceBase 类的 call_wrapper 方法可以记录该服务的请求和响应 XML 数据。 但是实施同样的方法会导致奇怪的日志记录等问题:

class ServiceBaseAbstract(ServiceBase):
    def call_wrapper(cls, ctx):
        try:
            return ctx.service_class.call_wrapper(ctx)
        except Exception as err:
            print err

它给出了一个错误:

No handlers could be found for logger "spyne.application.server"

API 工作正常,无需覆盖 call_wrapper。

我真的很困惑,找不到解决办法。您的帮助将不胜感激。谢谢

【问题讨论】:

  • 这不是错误,而是警告,而且它不是来自 Spyne,而是来自 Python 的日志基础设施。您需要配置 Python 日志记录以查看 任何 日志消息。

标签: django python-2.7 spyne


【解决方案1】:

重写 call_wrapper 是为了改变 Spyne 处理/记录异常的方式。

相反,您应该配置 python 日志库以显示调试级别的消息,并为 Spyne 启用协议调试日志记录。

logging.getLogger('').setLevel(logging.DEBUG)        
logging.getLogger('spyne.protocol.xml').setLevel(logging.DEBUG)

【讨论】:

  • 我在覆盖 ServiceBase 类 from spyne.service import ServiceBase 时遇到了记录器问题。相反,我必须从 Application Class from spyne.application import Application 覆盖以使其工作,看起来像这样 try: ctx_call_wrapper_res = super(MyApplication, self).call_wrapper(ctx) except Exception, e: pass # custom code
猜你喜欢
  • 2015-02-25
  • 2011-01-19
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 2016-08-23
  • 1970-01-01
  • 2015-12-25
  • 2014-03-07
相关资源
最近更新 更多