Skip to main content

WSGI listener middleware for WSGI Web Applications inspired by the

Project description

WSGI Listener

Request/Response Inspection for WSGI Web Applications

WSGI listener middleware for WSGI Web Applications inspired by the original wsgi-request-logger by Philipp Klaus and L. C. Rees.

Provides hooks during the request and response cycle by adding an extra level of indirection.

Instead of directly logging the response, this middleware provides an interface to easily inspect the request and response. The default behavior logs the response similarly to the original project. However, now additional listeners can be added to both the request and response cycle. The request and response body content is part of the interface.

Project Homepage: Original project's Homepage:

Easily add loggers, emailers, event systems, etc, with the request_listeners and response_listener hooks.


todo: Ship to pypi Simply install this Python module via

pip install wsgi-listener


To add this middleware to your WSGI application with the default response logger named wsgilistener in Apache format.

from wsgi_listener import WSGIListenerMiddleware

def application(environ, start_response):
    response_body = 'The request method was %s' % environ['REQUEST_METHOD']
    response_body = response_body.encode('utf-8')
    response_headers = [('Content-Type', 'text/plain'),
                        ('Content-Length', str(len(response_body)))]
    start_response('200 OK', response_headers)
    return [response_body]

loggingapp = WSGIListenerMiddleware(application)

if __name__ == '__main__':
    from wsgiref.simple_server import make_server
    http = make_server('', 8080, loggingapp)

Custom handlers

The interface for the Request listeners is:

from abc import ABC, abstractmethod

class AbstractBaseRequestListener(ABC):
    def handle(self, environ: dict, request_body: bytes, **kwargs) -> None:
        """Defines the interface for Request listeners.

            environ: The WSGI envion dictionary
            request_body: The bytes content of the request, if any
            **kwargs: Optional hook for additional data

and the interface for Response listeners is:

from abc import ABC, abstractmethod

class AbstractBaseResponseListener(ABC):
    def handle(self, status_code: int, environ: dict, content_length: int, response_body: bytes,
               processing_time: float, **kwargs) -> None:
        """Defines the interface for Response listeners.

            status_code: HTTP status code as integer
            environ: WSGI environ dictionary
            content_length: Number of bytes returned as int
            response_body: The response content, if any
            processing_time: The time in miliseconds to process the request
            **kwargs: Extensible hook

Simply instantiate your hooks and add them during init or with the add_listener methods.

The Authors

This WSGI middleware was originally developed under the name wsgilog by L. C. Rees. It was forked by Philipp Klaus in 2013 to build a WSGI middleware for request logging rather than exception handling and logging, and then forked again by Jonny Fuller in 2019 to add the additional layer of indirection.


This software, wsgi-listener, is published under a 3-clause BSD license.

Developers' Resources

  • The WSGI - Web Server Gateway Interface - is defined in PEP 333 with an update for Python 3 in PEP 3333.

General References

Project details

Release history Release notifications | RSS feed

This version


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for wsgi_listener, version 0.1
Filename, size File type Python version Upload date Hashes
Filename, size wsgi_listener-0.1-py3-none-any.whl (19.0 kB) File type Wheel Python version py3 Upload date Hashes View
Filename, size wsgi_listener-0.1.tar.gz (8.8 kB) File type Source Python version None Upload date Hashes View

Supported by

AWS AWS Cloud computing Datadog Datadog Monitoring DigiCert DigiCert EV certificate Facebook / Instagram Facebook / Instagram PSF Sponsor Fastly Fastly CDN Google Google Object Storage and Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Salesforce Salesforce PSF Sponsor Sentry Sentry Error logging StatusPage StatusPage Status page