如何避免在开发环境中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 1.7.1及以上 用以下命令 1....
    夏天夏星阅读 5,704评论 0 17
  • 模块间联系越多,其耦合性越强,同时表明其独立性越差( 降低耦合性,可以提高其独立性)。软件设计中通常用耦合度和内聚...
    riverstation阅读 2,096评论 0 8
  • 切换到创建项目的目录 cd C:\Users\admin\Desktop\DjangoProject创建名为pr...
    在努力中阅读 3,314评论 2 3
  • 点我查看本文集的说明及目录。 本项目相关内容包括: 实现过程: CH7 创建在线商店 CH8 管理支付和订单 CH...
    学以致用123阅读 3,751评论 0 6
  • 很偶然的机会,听到邓丽君的这首歌。 あなたと共に生きてゆく 忽然想到曾经,竟然有幸想与一个人共度此生。 那种感觉,...
    SandmanLi阅读 556评论 0 0