Python 烧瓶(Werkzeug)调试器的条件激活?

Python 烧瓶(Werkzeug)调试器的条件激活?,python,debugging,ip,flask,Python,Debugging,Ip,Flask,我即将部署一个Flask应用程序,由于内置调试器非常好,我想知道是否可以在生产环境中使用它 因此,我正在寻找一种有条件的方式来激活调试器,比如只针对来自特定IP的请求,或者只针对cookie中具有特殊密码的请求(或者满足两种密码) 我想没有内置的方法可以做到这一点,因此我很想得到一个建议,我应该挖到哪里来破解这个问题。也许有可能做到这一点? 另外,如果这是一个坏主意,请告诉我原因。很可能通过黑客Werkzeug的DebuggedApplication类启用或禁用调试器(请参阅源代码) 但这是个糟

我即将部署一个Flask应用程序,由于内置调试器非常好,我想知道是否可以在生产环境中使用它

因此,我正在寻找一种有条件的方式来激活调试器,比如只针对来自特定IP的请求,或者只针对cookie中具有特殊密码的请求(或者满足两种密码)

我想没有内置的方法可以做到这一点,因此我很想得到一个建议,我应该挖到哪里来破解这个问题。也许有可能做到这一点?
另外,如果这是一个坏主意,请告诉我原因。

很可能通过黑客Werkzeug的
DebuggedApplication
类启用或禁用调试器(请参阅源代码)

但这是个糟糕的主意。这是一个生产系统,在你去调试你的问题的同时,会有真正的用户通过不同的线程或进程与应用程序交互。可能发生的一些事情:

  • Werkzeug的调试器可能在开发服务器中进行测试。在多进程或多线程服务器下使用时,它可能工作,也可能不工作
  • 当您调试问题时,会有真实用户在不同的进程或线程上与应用程序交互,可能会从您下面更改应用程序的状态,这可能会影响您的调试
  • 调试问题时,可能会无意中更改应用程序的状态,从而影响当前使用系统的其他用户

正如@Miguel所指出的,这对于生产环境来说不是一个好主意,但为了防止黑客攻击,您可以这样做

class CustomDebuggedApplication(DebuggedApplication):
    def __call__(self, environ, start_response):
        # Note, this line can check whatever you want.  A cookie, a query string param, a header.  But don't read the post form body.  If you do, it is gone and can't be used later.
        if not request.args.get('secret', False) == 'Foo' and not request.args.get('__debugger__', False):
            return self.app(environ, start_response)
        return super(CustomerDebuggedApplication).__call__(environ, start_response)

是的,我同意这个东西很容易破坏东西,但我认为这是一种方便的方法,可以从回溯中获取一些状态变量,而回溯是不够的。但是,如果仔细使用,它可能是一种非常方便快捷的方法,可以找到有关您的问题的更多线索,而无需下载数据库来尝试在您的本地计算机上复制类似的环境。但只有您会看到这一点,因此任何遇到此错误的随机用户都不会对您有任何帮助。因此,您需要自己重新生成bug,如果必须这样做,您还可以在专用调试版本上进行。你为什么要搞乱你的生产系统?我想我低估了问题的严重性。生产环境(在我的例子中是守护进程模式下的mod_wsgi)将幸运地拥有多个进程(线程),为了能够进行调试,我需要在mod_wsgi中找到合适的线程,如果不修改mod_wsgi源代码,这可能是不可能的。。。