【问题标题】:How to debug Django in VSCode with autoreload turned on如何在打开自动重载的情况下在 VSCode 中调试 Django
【发布时间】:2020-11-06 16:42:55
【问题描述】:

我在 VSCode(Django 应用程序)中设置了调试,它在默认设置下效果很好。但是,在调试时似乎无法自动重新加载。这在 VSCode docs 中有说明:

请注意,调试时无法自动重新加载 Django 应用程序。

我想知道是否有某种方法可以使调试(断点等)工作在 Django 中启用重新加载。

【问题讨论】:

    标签: python django debugging visual-studio-code vscode-debugger


    【解决方案1】:

    事实证明,您可以使用 Microsoft 的 debugpy 工具来完成这项工作。

    当重新加载打开时(默认)Django 会启动两个进程,其中一个是父进程,另一个是执行重新加载魔法的子进程。

    Django 通过在子进程中将环境变量 RUN_MAIN 设置为 true 来区分这两个进程(它执行重新加载)。参考:https://github.com/django/django/blob/8a902b7ee622ada258d15fb122092c1f02b82698/django/utils/autoreload.py#L241

    通过稍微调整manage.py,我们可以在父进程中启动一个调试侦听器,并让它在任何重新加载后仍然存在。

    1. 添加debugpy 来管理您的需求(requirements.txt 等)

    2. 添加如下函数初始化调试器:

    def initialize_debugger():
        import debugpy
        
        # optionally check to see what env you're running in, you probably only want this for 
        # local development, for example: if os.getenv("MY_ENV") == "dev":
    
        # RUN_MAIN envvar is set by the reloader to indicate that this is the 
        # actual thread running Django. This code is in the parent process and
        # initializes the debugger
        if not os.getenv("RUN_MAIN"):
            debugpy.listen(("0.0.0.0", 9999))
            sys.stdout.write("Start the VS Code debugger now, waiting...\n")
            debugpy.wait_for_client()
            sys.stdout.write("Debugger attached, starting server...\n")
    
    
    1. 修改manage.py中的main函数如下:
        def main()
            # <...>
            initialize_debugger()  # add this
            execute_from_command_line(sys.argv)
    
    
    1. 修改 VSCode 中的 launch.json 配置以附加到端口 9999(从上方):
            {
                "name": "Python: Remote Attach (DebugPy)",
                "type": "python",
                "request": "attach",
                "port": 9999,
                "host": "localhost",
            },
    

    提示:您可以禁用“未捕获的异常”,因为重新加载本身会导致 SystemExit

    【讨论】:

      猜你喜欢
      • 2022-11-14
      • 1970-01-01
      • 1970-01-01
      • 2021-07-07
      • 2021-01-17
      • 1970-01-01
      • 2017-12-08
      • 1970-01-01
      • 2020-10-19
      相关资源
      最近更新 更多