Zgodnie z WSGI PEP, jeśli aplikacja zwraca iterator metodą close(), serwer powinien wywołać to na końcu żądania. Oto przykład:
"""
Run this script with 'python sleepy_app.py'. Then try connecting to the server
with curl:
curl -N http://localhost:8000/
You should see a counter printed in your terminal, incrementing once every
second.
Hit Ctrl-C on the curl window to disconnect the client. Then watch the
server's output. If running with a WSGI-compliant server, you should see
"SLEEPY CONNECTION CLOSE" printed to the terminal.
"""
class SleepyApp(object):
def __init__(self, environ, start_response):
self.environ = environ
self.start_response = start_response
def __iter__(self):
self.start_response('200 OK', [('Content-type', 'text/plain')])
# print out one number every 10 seconds.
import time # imported late for easier gevent patching
counter = 0
while True:
print "SLEEPY", counter
yield str(counter) + '\n'
counter += 1
time.sleep(1)
def close(self):
print "SLEEPY CONNECTION CLOSE"
def run_gevent():
from gevent.monkey import patch_all
patch_all()
from gevent.pywsgi import WSGIServer
server = WSGIServer(('0.0.0.0', 8000), SleepyApp)
print "Server running on port 0.0.0.0:8000. Ctrl+C to quit"
server.serve_forever()
if __name__ == '__main__':
run_gevent()
Istnieje jednak a bug w realizacji wsgiref Pythona (i na serwerze dev Django, która dziedziczy z nim), który zapobiega close() przed wezwał połowy strumienia rozłącza klienta. Dlatego też należy unikać wsgiref i serwera Django dla tego przypadku.
Należy również zauważyć, że funkcja close() nie zostanie uruchomiona natychmiast po rozłączeniu klienta. Stanie się tak, gdy spróbujesz napisać wiadomość do klienta i nie powiedzie się, ponieważ połączenie już nie istnieje.
Dziękuję bardzo za twoją myśl, naprawdę to doceniam. To jest coś, co NAPRAWDĘ chciałbym wiedzieć! =) #gevent na freenode wydaje się obecnie dość cichy ... Dzięki za odpowiedź denis! – RadiantHex
Zastanawiam się, byłoby to straszne pomysł, aby podnieść jakiś wyjątek w aplikacji WSGI asynchronicznie, jeśli klient został rozłączony? –