【问题标题】:Turning on DEBUG on a Django production site在 Django 生产站点上打开 DEBUG
【发布时间】:2011-01-23 18:08:30
【问题描述】:

我在非 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 吗?

【问题讨论】:

    标签: python django debugging


    【解决方案1】:

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

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

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

    编辑:

    如果你只使用 Django ORM,那么 afaik 只有两件事会有所不同:

    • 查询将使用 CursorDebugWrapper 保存
    • 如果查询导致数据库警告,则会引发异常。

    【讨论】:

    • 正如我所说,我们只使用 ORM,因此即使打开了 DEBUG,我们的服务器也不会将我们的堆栈跟踪暴露给不受信任的第三方。您知道不使用 DEBUG 的其他原因吗?
    猜你喜欢
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多