Как заставить серверы WSGI закрывать соединение после каждого ответа?
API для модуля Python wsgiref исключает хоп-хоп заголовки (как определено в RFC 2616).
Мне неясно, как заставить сервер завершить соединение после ответа (так как, кажется, нет способа добавить Connection: close
).
Эта проблема возникает при тестировании небольших приложений WSGI и микросервисов Bottle. Звонки из curl блокируются открытыми соединениями из браузера. Я должен щелкнуть обновление браузера, чтобы разорвать соединение, чтобы на ожидающий запрос скручивания могли быть получены ответы.
Очевидно, это должно быть решение на стороне сервера (разорвать соединение после ответа), а не на стороне клиента. Мне неясно, как это реализовать.
1 ответ
Это действительно основано на вашем WSGI-сервере, на котором вы размещаете свой фреймворк. Лучшее решение с бутылкой - провести ее через гевент.
botapp = bottle.app()
for Route in (mainappRoute,): #handle multiple files containing routes
botapp.merge(Route)
botapp = SessionMiddleware(botapp, beakerconfig) #in case you are using beaker sessions
botapp = WhiteNoise(botapp) #in case you want whitenoise to handle static files
botapp.add_files(staticfolder, prefix='static/') #add static route to whitenoise
server = WSGIServer(("0.0.0.0", int(80)), botapp) #gevent async web server
def shutdown():
print('Shutting down ...')
server.stop(timeout=60)
exit(signal.SIGTERM)
gevent.signal(signal.SIGTERM, shutdown)
gevent.signal(signal.SIGINT, shutdown) #CTRL C
server.serve_forever() #spawn the server
Вы можете очистить белизну и конфиги от бутылок, если они не нужны, я держу их там в качестве примера и предлагаю использовать их, если они обращены наружу.
Это чисто асинхронно на каждом соединении.