Skip to main content

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: https://github.com/JonnyWaffles/wsgi-listener Original project's Homepage: https://github.com/pklaus/wsgi-request-logger

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

Installation

todo: Ship to pypi Simply install this Python module via

pip install wsgi-listener

Usage

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)
    http.serve_forever()

Custom handlers

The interface for the Request listeners is:

from abc import ABC, abstractmethod

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

        Args:
            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):
    @abstractmethod
    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.

        Args:
            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.

License

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

Release files for wsgi_listener 0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for wsgi_listener 0.1
File Size Uploaded
wsgi_listener-0.1.tar.gz 8.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for wsgi_listener 0.1
File Interpreter ABI Platform
wsgi_listener-0.1-py3-none-any.whl Python 3 none any Details

Total release size:27.8 kB

Release files / wsgi_listener-0.1.tar.gz

Download URL wsgi_listener-0.1.tar.gz
Size 8.8 kB
Tags Source
SHA-256 checksum
How to use checksums
05432bf8947e2dcfccfac259bcb5d9010688c0388648a0e791c4429f4f855211
BLAKE2b-256 checksum
How to use checksums
9564339a2383a35aa9cf95b7e99abc804bd7c643905ae6d72c3b6373175172b3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via python-requests/2.22.0

Release files / wsgi_listener-0.1-py3-none-any.whl

Download URL wsgi_listener-0.1-py3-none-any.whl
Size 19.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c531168d67176a1594987961c1f00461c39f8960704bf829b843b1aaf024dd2f
BLAKE2b-256 checksum
How to use checksums
a3c77930b73acb524b14505c9d53ec88ac12d5a14e5bdf0695c550a59a95db2b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via python-requests/2.22.0

Release history Release notifications | RSS feed

This release

0.1 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page