美文网首页
如何避免在开发环境中Django启动两次

如何避免在开发环境中Django启动两次

作者: 啤酒沫 | 来源:发表于2019-01-15 19:22 被阅读0次

    遇到的问题

    Django中我们可能需要在启动时做某些初始化的动作,通过python manager.py runserver 0:8000命令来启动Django开发环境时,实际上Django启动了两次。第一次启动一个auto-reloader,第二次才是启动真正的应用。

    例如:我们希望使用ptvsd来对程序进行调试,需要在manager.py中加入ptvsd.enable_attach(address=('0.0.0.0', 3000))来开启debug端口。问题是Django启动了两次会成"端口被占用"的错误,导致无法启动。

    识别出哪个进程是关键

    Django启动的两个进程是有差别的。通过print('是否为关键进程:%s'%os.environ.get('RUN_MAIN'))`对进程进行观察发现。

    是否为关键进程:None
    是否为关键进程:true

    第二次启动的进程中此变量的值为字符串'true',那么我可以写如下的方法

    def isKeyProcess():
      import os
      return os.environ.get('RUN_MAIN')=='true'
    
    if isKeyProcess():
      ptvsd.enable_attach(address=('0.0.0.0', 3000))
    

    处理--noreload参数

    runserver的时候如果添加--noreload参数Djangoos.environ.get('RUN_MAIN')的返回值为None,上面的方法无法判断其是否为关键进程。
    可以通过判断启动命令行是否包含--noreload来进行识别。这里我们需要引入psutil

    def isKeyProcess():
      import psutil,os
      p = psutil.Process(os.getpid())
      return (os.environ.get('RUN_MAIN')=='true') or ('--noreload' in p.cmdline())
    
    if isKeyProcess():
      ptvsd.enable_attach(address=('0.0.0.0', 3000))
    

    相关文章

      网友评论

          本文标题:如何避免在开发环境中Django启动两次

          本文链接:https://www.haomeiwen.com/subject/lfpydqtx.html