django调试模式导致内存溢出的坑和关闭werkzeug的调试模式的方法(项目启动时出现:Debugger is active!)

一、django的调试模式

django的调试模式功能强大,但是在该模式下,所有的SQL查询都会被保存在内存中,所以项目上线后应该关闭调试模式,避免内存溢出。如果你发现自己的django项目内存占用不断升高,不用慌,可能仅仅是由于开启了调试模式。

二、werkzeug的调试模式

安全团队的同事提醒我们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!的提示已经没有了。

你可能感兴趣的:(Python)