2010-03-04 72 views
0

我在非Django应用程序中使用Django ORM,并且希望打开DEBUG设置,以便我可以定期记录我的查询。所以我有一些隐约这样的:打开Django制作网站上的DEBUG

from django.db import connection 

def thread_main_loop(): 
    while keep_going: 
     connection.queries[:] = [] 
     do_something() 
     some_logging_function(connection.queries) 

我想这样做我的生产服务器上,但商务部警告说,“同样重要的是要记住,使用调试运行时开启,Django会记得每执行一次SQL查询,这在调试时很有用,但在生产服务器上,它将快速消耗内存。“

因为connection.queries列表每次通过每个线程的主循环被清除,我相信Django查询日志记录不会导致我的应用程序消耗内存。它是否正确?如果我只使用Django ORM,是否还有其他原因不会在生产环境中关闭DEBUG?

回答

2

DEBUG模式您的应用程序中的任何错误将导致详细的Django stacktrace。这在生产环境中是非常不可取的,因为它可能会泄露攻击者可以在您的网站上使用的敏感信息。即使你的应用程序看起来很稳定,我也不会冒险。

我宁愿雇用一个以某种方式将查询记录到文件的中间件。或直接统计数据库,例如(对于MySQL)。

watch -n 1 mysqladmin --user=<user> --password=<password> processlist 

编辑:

如果你只使用Django的ORM,那么据我所知只有两件事情会有所不同:

  • 查询将被保存在CursorDebugWrapper
  • 如果查询会导致数据库警告,这会引发异常。
+0

好吧,正如我所说的,我们只使用ORM,所以即使DEBUG打开,我们的服务器也不会将我们的堆栈跟踪暴露给不受信任的第三方。您有没有其他原因让您知道不使用DEBUG? – 2010-03-04 17:01:54

+1

哦,对了,我扩展了我的答案。 – stefanw 2010-03-05 09:37:58