Python Django如何调试queryset对象上的冻结保存操作

Python Django如何调试queryset对象上的冻结保存操作,python,django,Python,Django,我在Django项目中有以下代码(在Django Rest框架序列化程序的create方法中) def创建(自我验证的_数据): log.info(“\n\n\n”) info(f“django模型:{self.Meta.model}”) log.info(“正在创建案例…”) case=self.Meta.model(**kwargs) log.info(f“要保存的案例:{Case}”) case.save() log.info(f“创建的案例对象:{Case}”) 当我发布到端点时,它完

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

def创建(自我验证的_数据):
log.info(“\n\n\n”)
info(f“django模型:{self.Meta.model}”)
log.info(“正在创建案例…”)
case=self.Meta.model(**kwargs)
log.info(f“要保存的案例:{Case}”)
case.save()
log.info(f“创建的案例对象:{Case}”)
当我发布到端点时,它完全冻结在.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
2020-06-15 02:47:46008-序列化程序-信息===>django型号:
2020-06-15 02:47:46008-序列化程序-信息===>django型号:
2020-06-15 02:47:46009-序列化程序-信息===>立即创建案例。。。。。
2020-06-15 02:47:46009-序列化程序-信息===>立即创建案例。。。。。
2020-06-15 02:47:46010-序列化程序-信息==>要保存的案例:塞舌尔8698
2020-06-15 02:47:46010-序列化程序-信息==>要保存的案例:塞舌尔8698

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

这个错误可能与使用Django rest序列化程序无关,因为挂起simple的代码创建了一个新模型并保存了它。现在,您没有指定如何定义
kwargs
,但最有可能的候选者是它无法与数据库通信

要调试代码,您应该学习如何单步执行代码。有许多选项取决于您的偏好

Visual studio代码 安装
debugpy
软件包

运行python3-m debugpy--listen localhost:12345--pid

运行“Python:remoteattach”命令

CLI 在行
case.save()之前

import pdb; pdb.set_trace()
这假设您以交互方式运行Django服务器,而不是通过gunicorn。您将在保存行之前获得一个调试控制台。当控制台出现时,键入“c”并按enter键继续执行。然后在进程出现停滞时按Ctrl+C。键入
bt
以了解过程中发生了什么

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

gdb-p

当进程出现停滞时。然后键入“bt”并按enter键以获取正在发生的事情的本地回溯。这将有助于您识别数据库客户端等异常情况。

Django很可能正在等待数据库服务器的响应,这是一个配置问题,而不是它冻结的Python代码中的问题。最好在调试任何东西之前检查并排除这种可能性。例如,一个表被锁定或更新的行被另一个冻结的进程锁定,数据库中等待锁定结束的超时很长,Django等待数据库响应的超时很长或无限长

如果在另一个数据库客户机(最好是在您最喜欢的数据库管理器中)中执行类似的保存操作需要异常长的时间,则会进行确认

如果您看到锁定的Python进程的CPU%活动,那么等待套接字响应将被排除

如果您可以通过
python manage.py shell
python manage.py runserver--nothreading--nothreading
在CLI中重现该问题,可能会更容易探索。然后你可以按Ctrl+C,也许过一段时间后再按Ctrl+C。如果幸运的话,您杀死了进程,并将看到一个带有回溯的键盘中断。它可以帮助您确定进程是否在等待数据库服务器套接字响应以外的其他响应

Django中的另一个可能原因可能与连接到预保存后保存的自定义回调代码有关


您可以运行
python-m pdb manage.py…
并可以选择设置断点,或者只需按“c”“Enter”(继续),而不是简单的
python manage.py…
。该进程将运行,在出现任何异常后不会被终止,而是停留在
pdb
(本机Python调试器)中。

不知道何时键入bt
import pdb; pdb.set_trace()
gdb -p <pid_of_django>