代码之家  ›  专栏  ›  技术社区  ›  Eli Courtwright

在Django生产站点上打开调试

  •  0
  • Eli Courtwright  · 技术社区  · 14 年前

    我正在一个非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)
    

    我想在我的生产服务器上执行此操作,但文档警告, “同样重要的是要记住,当在启用调试的情况下运行时,Django将记住它执行的每个SQL查询。这在调试时很有用,但在生产服务器上,它将快速消耗内存。“

    connection.queries 每次通过每个线程的主循环都会清除列表,我相信Django查询日志记录不会导致我的应用程序消耗内存。这是正确的吗?如果我只使用Django ORM,是否还有其他理由不在生产环境中启用调试?

    1 回复  |  直到 14 年前
        1
  •  3
  •   stefanw    14 年前

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

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

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

    编辑:

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