我在 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 方法获取日志记录?
该错误可能与 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 键以获取正在发生的情况的本机回溯。这应该可以帮助您识别例如正在运行的数据库客户端。
| 归档时间: |
|
| 查看次数: |
1958 次 |
| 最近记录: |