2010-12-10 2 views
2

Hinzufügen einer Middleware, die nur die HTTP-Header (wie FirePython) ändert, ist ziemlich einfach, aber wenn Sie webapp.WSGIApplication (environ, start_response) aufrufen ‚‘] anstelle eines iterable mit dem Körper:Wie fügt man zu AppEngine eine WSGI Middleware, die den Körper der Antwort ändert

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

response.wsgi_write ist eigentlich die Verantwortung, den Körper des Druckens:

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

Dies macht es schwierig, den Körper durch eine WSGI Middleware zu ändern. Normalerweise würde ich nur tun:

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() 

Aber das funktioniert nicht, da der Rückgabewert von wrapped_app ist [ ‚‘]. Wie kann ich die Upperware-Middleware in Google AppEngine einsetzen? Was ist die Design-Entscheidung, die dazu führt, die Antwort zu schreiben, anstatt sie zurückzugeben?

Antwort

3

Wenn Sie wollen, um den Körper der Anforderung abfangen schreibt, müssen Sie Ihre eigenen start_response und write Funktionen definieren, etwa so:

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) 

Wie, warum Webapp auf diese Weise geschrieben wurde, ich bin Angst, ich kann es nicht sagen. Es sollte möglich sein, sein Verhalten zu ändern, um stattdessen einen Iterator oder eine Liste zu erhalten, ohne etwas zu brechen, also fühlen Sie sich frei file a bug.

+0

Danke für die Antwort. WRT den Fehlerbericht, getan http://code.google.com/p/googleappengine/issues/detail?id=4244 –

Verwandte Themen