Middleware Factories#

The middleware factory differ from the middleware in their need and usage. A middleware is global, and, sometimes, middleware data may differ per incoming requests.

The middleware factory, build a middleware and inject in in the blacksmith client on instanciation.

The main use case is for forwardin header

Forward http headers#

The list of middleware are defined under the setting keys middleware_factories and forwarded_headers, as in the example above.

BLACKSMITH_CLIENT = {
   "default": {
      "sd": "router",
      "router_sd_config": {},
      "forwarded_headers": ["Authorization", "Accept-Language"],
      "middleware_factories": [
            "dj_blacksmith.AsyncForwardHeaderFactoryBuilder",
            # Or the Sync version for synchronous client
            # "dj_blacksmith.SyncForwardHeaderFactoryBuilder",
      ],
   },
}

In this example, the forward_header middleware factory will forward the Authorization header if present in the Django request, to every blacksmith instanciated clients without writing a line of code.

Custom Middleware Factory#

To load a custom middleware, a class can be passed on the same line

BLACKSMITH_CLIENT = {
   "default": {
      "sd": "router",
      "router_sd_config": {},
      "my_middleware_configuration": {"I can configure from this"},
      "middleware_factories": [
            "path.to.my.MyMiddlewareBuilder",
      ],
   },
}

In the example above, the class MyMiddlewareBuilder overrides the class pyramid_blacksmith.AbstractMiddlewareFactoryBuilder.

The constructor of the class will received the whole default dict content, and can configure itself throw the keys in it such as my_middleware_configuration.