Multithreaded dev web server for the Python Bottle web framework
Monday, February 15th, 2016
I’m writing a simple web application in the Bottle framework. I ran into an issue where I had a single long-running request, but needed to make some additional requests from the browser to the server. It turns out that Bottle’s built in development web server is single-threaded, and can’t handle multiple requests at the same time. This is annoying, since I don’t want to have to deploy my application each time I make a change; that’s what’s the built-in development web server is for.
The solution is easy: create a very simple multithreaded WSGI web server and use that to serve the Bottle application.
wsgiserver.py
"""
Simple multithreaded WSGI HTTP server.
"""
from wsgiref.simple_server import make_server, WSGIServer
from SocketServer import ThreadingMixIn
class ThreadingWSGIServer(ThreadingMixIn, WSGIServer):
daemon_threads = True
class Server:
def __init__(self, wsgi_app, listen='127.0.0.1', port=8080):
self.wsgi_app = wsgi_app
self.listen = listen
self.port = port
self.server = make_server(self.listen, self.port, self.wsgi_app,
ThreadingWSGIServer)
def serve_forever(self):
self.server.serve_forever()
We then include that in the file where we create our Bottle app:
app.py
import bottle import wsgiserver wsgiapp = bottle.default_app() httpd = wsgiserver.Server(wsgiapp) httpd.serve_forever()
We now have a Bottle app that can handle multiple concucrrent requests. I’m not sure how well this works with automatic reloading and such, but I think it should be fine.
