Serving

This guide shows you how to serve Rolo components through different Python web server technologies.

WSGI

Serving a Router as WSGI app

If you only need a Router instance to serve your application, you can convert to a WSGI app using the Router.wsgi() method.

from rolo import Router, route
from rolo.routing import handler_dispatcher

@route("/")
def index(request):
    return "hello world"

router = Router(dispatcher=handler_dispatcher())
router.add(index)

app = router.wsgi()

Now you can use any old WSGI compliant server to serve the application. For example, if this file is stored in myapp.py, using gunicorn, you can:

pip install gunicorn
gunicorn -w 4 myapp:app

Serving a Gateway as WSGI app

Unless you need Websockets, the Rolo Request object is fully WSGI compliant, so you can also use any WSGI server to serve a Gateway. Simply use the WSGIGateway adapter.

from rolo.gateway import Gateway
from rolo.gateway.wsgi import WsgiGateway

gateway: Gateway = ...

app = WsgiGateway(gateway)

Similar to the previous example, you can serve the app object through any WSGI compliant server.

ASGI

ASGI servers like Hypercorn allow asynchronous server communication, which is needed for HTTP/2 streaming or Websockets. Gateways can be served through the AsgiGateway adapter, which exposes a Gateway as an ASGI3 application. Under the hood, it uses our own ASGI/WSGI bridge (AsgiAdapter), and converts ASGI calls to WSGI calls for regular HTTP requests, and uses ASGI websockets for serving rolo websockets. File myapp.py:

from rolo.gateway import Gateway
from rolo.gateway.asgi import AsgiGateway

gateway: Gateway = ...

app = AsgiGateway(gateway)

Now you can use Hypercorn or other ASGI servers to serve the app object.

pip install hypercorn
hypercorn myapp:app

Twisted

Rolo can be served through Twisted, which supports both WSGI and Websockets. You will need twisted, and wsproto installed pip install twisted wsproto.

from rolo.gateway import Gateway
from rolo.serving.twisted import TwistedGateway
from twisted.internet import endpoints, reactor

gateway: Gateway = ...

# Rolo/Twisted adapter, that exposes a Rolo Gateway as a twisted.web.server.Site object
site = TwistedGateway(gateway)

endpoint = endpoints.TCP4ServerEndpoint(reactor, 8000)
endpoint.listen(site)

reactor.run()