Hooks

Falcon supports before and after hooks. You install a hook simply by applying one of the decorators below, either to an individual responder or to an entire resource.

For example, consider this hook that validates a POST request for an image resource:

def validate_image_type(req, resp, resource, params):
    if req.content_type not in ALLOWED_IMAGE_TYPES:
        msg = 'Image type not allowed. Must be PNG, JPEG, or GIF'
        raise falcon.HTTPBadRequest('Bad request', msg)

You would attach this hook to an on_post responder like so:

@falcon.before(validate_image_type)
def on_post(self, req, resp):
    pass

Or, suppose you had a hook that you would like to apply to all responders for a given resource. In that case, you would simply decorate the resource class:

@falcon.before(extract_project_id)
class Message(object):
    def on_post(self, req, resp, project_id):
        pass

    def on_get(self, req, resp, project_id):
        pass

Note also that you can pass additional arguments to your hook function as needed:

def validate_image_type(req, resp, resource, params, allowed_types):
    if req.content_type not in allowed_types:
        msg = 'Image type not allowed.'
        raise falcon.HTTPBadRequest('Bad request', msg)

@falcon.before(validate_image_type, ['image/png'])
def on_post(self, req, resp):
    pass

Falcon supports using any callable as a hook. This allows for using a class instead of a function:

class Authorize(object):
    def __init__(self, roles):
        self._roles = roles

    def __call__(self, req, resp, resource, params):
        pass

@falcon.before(Authorize(['admin']))
def on_post(self, req, resp):
    pass

Falcon middleware components can also be used to insert logic before and after requests. However, unlike hooks, middleware components are triggered globally for all requests.

Tip

In order to pass data from a hook function to a resource function use the req.context and resp.context dictionaries. These context dictionaries are intended to hold request and response data specific to your app as it passes through the framework.

falcon.before(action, *args, **kwargs)[source]

Decorator to execute the given action function before the responder.

Parameters:
  • action (callable) –

    A function of the form func(req, resp, resource, params), where resource is a reference to the resource class instance associated with the request, and params is a dict of URI Template field names, if any, that will be passed into the resource responder as kwargs.

    Note

    Hooks may inject extra params as needed. For example:

    def do_something(req, resp, resource, params):
        try:
            params['id'] = int(params['id'])
        except ValueError:
            raise falcon.HTTPBadRequest('Invalid ID',
                                        'ID was not valid.')
    
        params['answer'] = 42
    
  • *args – Any additional arguments will be passed to action in the order given, immediately following the req, resp, resource, and params arguments.
  • **kwargs – Any additional keyword arguments will be passed through to action.
falcon.after(action, *args, **kwargs)[source]

Decorator to execute the given action function after the responder.

Parameters:
  • action (callable) – A function of the form func(req, resp, resource), where resource is a reference to the resource class instance associated with the request
  • *args – Any additional arguments will be passed to action in the order given, immediately following the req, resp, resource, and params arguments.
  • **kwargs – Any additional keyword arguments will be passed through to action.