关于python:如何整合pynba和Flask的pythonic方式?

Howto pythonic way to integrate pynba and Flask?


pip安装烧瓶
pip安装pynba

我尝试下面的代码

1
2
3
4
5
6
7
8
9
    import flask
    import pynba.wsgi

    class FlaskWithPynba(flask.Flask):
        @pynba.wsgi.monitor(('localhost', 30002))
        def wsgi_app(self, environ, start_response):
            super(FlaskWithPynba, self).wsgi_app(environ, start_response)

    app = FlaskWithPynba('myapp')

但是在调用app.run()时会出现一些错误

1
2
3
4
5
6
7
8
9
    Traceback (most recent call last):
      File"/home/coffee/venv/local/lib/python2.7/site-packages/flask/app.py",
    line 1836, in __call__
        return self.wsgi_app(environ, start_response)
      File"pynba/wsgi/middleware.pyx", line 63,
    in pynba.wsgi.middleware.PynbaMiddleware.__call__ (pynba/wsgi/middleware.c:1554)
      File"pynba/wsgi/middleware.pyx", line 64,
    in pynba.wsgi.middleware.PynbaMiddleware.__call__ (pynba/wsgi/middleware.c:1510)
    TypeError: wsgi_app() takes exactly 3 arguments (2 given)

看起来像pynba decorator只能用于普通函数而不是类的方法。

您需要执行以下操作:

1
2
3
4
5
myapp = Flask()

@pynba.wsgi.monitor(('localhost', 30002))
def app(environ, start_response):
    return myapp(environ, start_response)

编写可以对类的函数和方法起作用的单个装饰器实现是非常重要的。他们或许应该查看wrapt装饰器库并使用它来正确地完成它。

FWIW。如果他们的中间件包装器是:

  • https://github.com/johnnoone/pynba/blob/master/pynba/wsgi/middleware.py#L39

那么它无论如何也不能正常工作。当WSGI应用程序是一个生成器时,所有时间都是Python用来创建生成器对象的时间。它不会花费WSGI应用程序代码运行多长时间。即使在WSGI应用程序的正常功能上,它也不会花费WSGI服务器发送响应所需的时间,然后调用返回的任何可迭代的close()。因此,无法准确表示整个WSGI应用程序需要多长时间。