在Django生产站点上启用DEBUG模式
我在一个非Django的应用程序中使用Django的ORM(对象关系映射),想要开启DEBUG设置,这样我就可以定期记录我的查询。大概是这样的:
from django.db import connection
def thread_main_loop():
while keep_going:
connection.queries[:] = []
do_something()
some_logging_function(connection.queries)
我想在我的生产服务器上这样做,但文档提醒说,"记住,当DEBUG开启时,Django会记住它执行的每一个SQL查询。这在调试时很有用,但在生产服务器上,这会迅速消耗内存."
因为每个线程的主循环每次都会清空connection.queries
列表,所以我认为Django的查询日志记录不会导致我的应用程序消耗内存。这是对的吗?如果我只是使用Django的ORM,还有其他原因不应该在生产环境中开启DEBUG吗?
1 个回答
3
在DEBUG
模式下,你的应用程序出现任何错误都会显示详细的Django错误追踪信息。这在生产环境中是非常不好的,因为这可能会泄露敏感信息,攻击者可以利用这些信息来攻击你的网站。即使你的应用看起来很稳定,我也不建议冒这个险。
我更倾向于使用一种中间件,能够将查询记录到文件中。或者直接获取数据库的统计信息,比如(对于MySQL)。
watch -n 1 mysqladmin --user=<user> --password=<password> processlist
补充:
如果你只使用Django的ORM,那么据我所知,只有两件事情会有所不同:
- 查询会通过CursorDebugWrapper保存
- 如果查询导致数据库警告,这将引发一个异常。