# Custom extensions
It is possible to create your own custom extensions.
Version 22.9 added the Extend.register
method. This makes it extremely easy to add custom expensions to an application.
# Anatomy of an extension
All extensions must subclass Extension
.
# Required
name
: By convention, the name is an all-lowercase stringstartup
: A method that runs when the extension is added
# Optional
label
: A method that returns additional information about the extension in the MOTDincluded
: A method that returns a boolean whether the extension should be enabled or not (could be used for example to check config state)
# Example
from sanic import Request, Sanic, json
from sanic_ext import Extend, Extension
app = Sanic(__name__)
app.config.MONITOR = True
class AutoMonitor(Extension):
name = "automonitor"
def startup(self, bootstrap) -> None:
if self.included():
self.app.before_server_start(self.ensure_monitor_set)
self.app.on_request(self.monitor)
@staticmethod
async def monitor(request: Request):
if request.route and request.route.ctx.monitor:
print("....")
@staticmethod
async def ensure_monitor_set(app: Sanic):
for route in app.router.routes:
if not hasattr(route.ctx, "monitor"):
route.ctx.monitor = False
def label(self):
has_monitor = [
route
for route in self.app.router.routes
if getattr(route.ctx, "monitor", None)
]
return f"{len(has_monitor)} endpoint(s)"
def included(self):
return self.app.config.MONITOR
Extend.register(AutoMonitor)
@app.get("/", ctx_monitor=True)
async def handler(request: Request):
return json({"foo": "bar"})
# Extension preregistration
Extend.register
simplifies the addition of custom extensions.
from sanic_ext import Extend, Extension
class MyCustomExtension(Extension):
...
Extend.register(MyCustomExtension())
Added in v22.9