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

遇到的问题

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启动两次)