gpt4 book ai didi

django - 如何查看 channel 消费者引发的异常

转载 作者:行者123 更新时间:2023-12-02 07:22:06 25 4
gpt4 key购买 nike

我开始使用django-channels,我发现它非常棒。然而,调试消费者是痛苦的,因为当消费者内部引发一些异常时,没有任何内容打印到终端,websocket 只是断开连接。

未显示的异常类型不易识别。 AssertionError 是系统性的情况,还有其他一些情况,例如下面的代码:

class MexicoProgressConsumer(ProgressConsumer):
def init(self, SSDBConfig, Sub_application):
subappli = models.Sub_application.objects.get(pk=Sub_application)
...

使用错误数量的参数调用此方法不会在控制台上打印任何内容并断开 Websocket。如果最后一行的 get 失败,则同上。

有没有办法像其他异常一样查看这些异常?

最佳答案

从 albar 的 answer 开始,我达到的解决方案是像这样定义一个装饰器

from functools import wraps
from logging import getLogger

from channels.exceptions import AcceptConnection, DenyConnection, StopConsumer

logger = getLogger("foo-logger")

def log_exceptions(f):
@wraps(f)
async def wrapper(*args, **kwargs):
try:
return await f(*args, **kwargs)
except (AcceptConnection, DenyConnection, StopConsumer):
raise
except Exception as exception:
if not getattr(exception, "logged_by_wrapper", False):
logger.error(
"Unhandled exception occurred in {}:".format(f.__qualname__),
exc_info=exception,
)
setattr(exception, "logged_by_wrapper", True)
raise

return wrapper

这有几项改进:

  • 使用 functools.wraps 使包装函数更类似于原始函数。
  • 使用 async/await 语法,因为我正在使用异步消费者(如果没有,请删除)
  • 不记录 django-channels 故意引发的多个异常。
  • 仅在未设置属性 logged_by_wrapper 时才记录异常。这会导致异常仅记录一次,因为我们在第一次记录后设置了该属性。
  • 使用Python的内置logging模块来记录错误。这会自动格式化异常和回溯,因为我们在 exc_info=exception 中提供了异常。

然后,我定义了一个类装饰器,而不是基类,以将其应用于消费者的方法

from inspect import iscoroutinefunction

def log_consumer_exceptions(klass):
for method_name, method in list(klass.__dict__.items()):
if iscoroutinefunction(method):
setattr(klass, method_name, log_exceptions(method))

return klass

这将 log_exceptions 应用于 Consumer 中定义的所有异步方法,但不适用于它继承的方法 - 即仅应用于 Consumer 的自定义方法。

关于django - 如何查看 channel 消费者引发的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54458852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com