django的调试模式功能强大,但是在该模式下,所有的SQL查询都会被保存在内存中,所以项目上线后应该关闭调试模式,避免内存溢出。如果你发现自己的django项目内存占用不断升高,不用慌,可能仅仅是由于开启了调试模式。
安全团队的同事提醒我们django项目的调试模式被打开了,找了半天才发现打开的是werkzeug的调试模式而不是django的调试模式。那么怎么关闭它呢?
经过定位,我们发现是django_extensions库的runserver_plus命令调用了werkzeug的接口函数,因此我们需要定义自己的runserver_plus命令,覆盖django_extensions库的runserver_plus命令,在调用werkzeug的接口时关闭调试模式。步骤如下:
1. 复制命令文件
django_extensions库是django的命令扩展库,我们需要把runserver_plus命令对应的文件从它的安装路径复制到我们自己项目的根目录。
python_path/dist-packages/django_extensions/management/commands/runserver_plus.py复制到project_path/management/commands/runserver_plus.py,其中python_path是python库的安装路径,project_path是项目的根目录。
2. 修改自定义命令文件
修改project_path/management/commands/runserver_plus.py,把Command.inner_run方法调用的run_simple的入参use_debugger改为False。
run_simple(
self.addr,
int(self.port),
handler,
use_reloader=use_reloader,
use_debugger=True,
extra_files=extra_files,
reloader_interval=reloader_interval,
reloader_type=reloader_type,
threaded=threaded,
request_handler=WSGIRequestHandler,
ssl_context=ssl_context,
)
改成
run_simple(
self.addr,
int(self.port),
handler,
use_reloader=use_reloader,
use_debugger=False,
extra_files=extra_files,
reloader_interval=reloader_interval,
reloader_type=reloader_type,
threaded=threaded,
request_handler=WSGIRequestHandler,
ssl_context=ssl_context,
)
3. 修改项目配置
修改settings.py的INSTALLED_APPS项,确保我们的项目的应用写在django_extensions之前,这样我们自定义的runserver_plus命令才会覆盖django_extensions的runserver_plus命令。
INSTALLED_APPS = [
...
'project.ProjectConfig', # 安装我们的项目的应用,要放在django_extensions前面
'django_extensions', # 安装django_extensions应用
...
]
重新启动项目以后我们就会发现Debugger is active!的提示已经没有了。