Wenn man WSGI Middlewares programmiert ist es jedes mal nötig die close Methode der Anwendung aufzurufen wenn nötig.
1 class CallbackIterator(object):
2
3 def __init__(self, app, on_iteration=None, on_close=None):
4 self.appiter = iter(app)
5 self.on_iteration = on_iteration or lambda s, l: l
6 self.on_close = on_close or lambda s: None
7
8 def __iter__(self):
9 return self
10
11 def next(self):
12 try:
13 return self.on_iteration(self.appiter.next())
14 except:
15 self.close()
16 raise
17
18 def close(self):
19 if hasattr(self.appiter, 'close'):
20 self.appiter.close()
21 self.on_close()
Verwendet kann das dann beispielsweise so werden:
1 class ReplaceMiddleware(object):
2
3 def __init__(self, app):
4 self.app = app
5
6 def on_iter(self, line):
7 return line.replace('<BLUB!>', 'blub blub blub')
8
9 def __call__(self, environ, start_response):
10 result = self.app(environ, start_response)
11 return CallbackIter(result, self.on_iter)