如何避免在开发环境中Django启动两次
2019-01-15 本文已影响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
参数Django
则os.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))