FiltersΒΆ

There is support for CorePost resource filters via the two following corepost.filter interfaces:

class IRequestFilter(Interface):
    """Request filter interface"""
    def filterRequest(self,request):
        """Allows to intercept and change an incoming request"""
        pass

class IResponseFilter(Interface):
    """Response filter interface"""
    def filterResponse(self,request,response):
        """Allows to intercept and change an outgoing response"""
        pass

A filter class can implement either of them or both (for a wrap around filter), e.g.:

class AddCustomHeaderFilter():
    """Implements a request filter that adds a custom header to the incoming request"""
    zope.interface.implements(IRequestFilter)

    def filterRequest(self,request):
        request.received_headers["Custom-Header"] = "Custom Header Value"

class Change404to503Filter():
    """Implements just a response filter that changes 404 to 503 statuses"""
    zope.interface.implements(IResponseFilter)

    def filterResponse(self,request,response):
        if response.code == 404:
            response.code = 503

class WrapAroundFilter():
    """Implements both types of filters in one class"""
    zope.interface.implements(IRequestFilter,IResponseFilter)

    def filterRequest(self,request):
        request.received_headers["X-Wrap-Input"] = "Input"

    def filterResponse(self,request,response):
        response.headers["X-Wrap-Output"] = "Output"

In order to activate the filters on a RESTResource instance, you need to pass a list of them in the constructor as the filters parameter, e.g.:

class FilterApp:

    @route("/",Http.GET)
    def root(self,request,**kwargs):
        return request.received_headers

def run_filter_app():
    app = RESTResource(services=(FilterApp(),),filters=(Change404to503Filter(),AddCustomHeaderFilter(),WrapAroundFilter(),))
    app.run(8083)

Previous topic

Modular REST applications

Next topic

Asynchronous Operations

This Page