2010-12-10 6 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の戻り値が['']であるためです。 Google App EngineでUpperwareミドルウェアを動作させるにはどうすればよいですか?応答を返すのではなく、応答を書くことにつながる設計上の決定は何ですか?私は、Webアプリケーションがこのように書かれていた理由として

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) 

答えて

3

あなたがインターセプトしたい場合は、リクエストのボディに書き込み、あなたはそうのような、独自のstart_responsewrite関数を定義する必要があります私は言うことができないと恐れている。反復子またはリストを生成するようにその動作を変更することは可能です。何も破らずにfile a bugを自由に使用してください。

+0

返信いただきありがとうございます。バグレポートをWRTし、http://code.google.com/p/googleappengine/issues/detail?id=4244 –

関連する問題