Django 如何调试查询集对象上的冻结保存操作

Nei*_*eil 5 python django

我在 Django 项目中有以下代码(在 Django Rest Framework 序列化器的 create 方法中)

def create(self, validated_data):
     <...>
     log.info("\n\n\n")
     log.info(f"django model: {self.Meta.model}")
     log.info("CREATING CASE NOW .....")
     case = self.Meta.model(**kwargs)
     log.info(f"Case to be saved: {case}")
     case.save()
     log.info(f"Case object Created: {case}")
Run Code Online (Sandbox Code Playgroud)

当我发布到端点时,它在 .save() 上完全冻结。这是示例输出:

2020-06-15 02:47:46,008 - serializers - INFO ===> django model: <class 'citator.models.InternalCase'>
2020-06-15 02:47:46,008 - serializers - INFO ===> django model: <class 'citator.models.InternalCase'>
2020-06-15 02:47:46,009 - serializers - INFO ===> CREATING CASE NOW .....
2020-06-15 02:47:46,009 - serializers - INFO ===> CREATING CASE NOW .....
2020-06-15 02:47:46,010 - serializers - INFO ===> Case to be saved: seychelles8698
2020-06-15 02:47:46,010 - serializers - INFO ===> Case to be saved: seychelles8698
Run Code Online (Sandbox Code Playgroud)

不会引发任何错误,并且连接不会中断。我该如何调试这个?有没有办法从 save 方法获取日志记录?

Kru*_*lur 3

该错误可能与 Django Rest 序列化器的使用无关,因为挂起的代码简单地创建了一个新模型并保存它。现在您没有指定如何kwargs定义,但最有可能的可能性是它与数据库的对话陷入困境。

要调试代码,您应该学习如何单步执行代码。根据您的喜好,有多种选择。

视觉工作室代码

安装debugpy软件包。

跑步python3 -m debugpy --listen localhost:12345 --pid <pid_of_django_process>

运行“Python:远程连接”命令。

命令行界面

行前case.save()

import pdb; pdb.set_trace()
Run Code Online (Sandbox Code Playgroud)

这假设您正在以交互方式运行 Django 服务器,而不是通过 Gunicorn 等。您将在保存行之前看到一个调试控制台。当控制台出现时,输入“c”并按 Enter 键继续执行。然后,当进程出现卡住时按 Ctrl+C。键入bt以了解该过程中发生的情况。

原生代码

如果堆栈跟踪指向本机代码,您可以切换到gdb. 要对此进行调试(请确保退出任何 Python 调试器或在没有调试器的情况下重新启动进程)。跑步

gdb -p <pid_of_django>
Run Code Online (Sandbox Code Playgroud)

当进程出现卡住时。然后输入“bt”并按 Enter 键以获取正在发生的情况的本机回溯。这应该可以帮助您识别例如正在运行的数据库客户端。