2010-12-10 55 views
2

添加仅修改HTTP标头(如FirePython)的中间件非常简单,但当您调用webapp.WSGIApplication(environ,start_response)时,它将返回[ “”]代替可迭代与主体:如何向AppEngine添加修改响应主体的WSGI中间件

def __call__(self, environ, start_response): 
    ... 
    response.wsgi_write(start_response) 
    return [''] 

response.wsgi_write实际上是负责打印体的:

def wsgi_write(self, start_response): 
    ... 
    write = start_response('%d %s' % self.__status, self.__wsgi_headers) 
    write(body) 
    self.out.close() 

这使得难以由WSGI中间件修改身体。通常我会这样做:

class Upperware: 
    def __init__(self, app): 
     self.wrapped_app = app 

def __call__(self, environ, start_response): 
    for data in self.wrapped_app(environ, start_response): 
     return data.upper() 

但是这不起作用,因为wrapped_app的返回值是['']。我怎样才能让Upperware中间件在Google AppEngine中工作?什么是设计决定,导致写回应而不是返回它?

回答

3

如果你想拦截写入请求的身体,你需要定义自己的start_responsewrite功能,像这样:

class Upperware(object): 
    def __init__(self, app): 
    self.wrapped_app = app 

    def __call__(self, environ, start_response): 
    def my_start_response(status, response_headers, exc_info=None): 
     write = start_response(status, response_headers, exc_info) 
     def my_write(body_data): 
     # Do your middleware handling of writes here 
     body_data = body_data.upper() 
     write(body_data) 
     return my_write 
    return self.wrapped_app(environ, my_start_response) 

至于为什么web应用程序是这样写的,我害怕我不能说。应该可以改变它的行为来产生迭代器或列表,而不会破坏任何东西,所以请随时拨打file a bug

+0

感谢您的回复。 WRT错误报告,已完成http://code.google.com/p/googleappengine/issues/detail?id=4244 – 2010-12-13 11:33:51