Класс Plugin
Класс Plugin представляет собой базовый класс
для всех плагинов Bottle. Плагины позволяют
расширять функциональность приложения: добавлять
новые типы маршрутов, изменять поведение
обработчиков, внедрять зависимости и многое другое.
Каждый плагин должен наследоваться от этого класса
и реализовывать методы setup, apply
и close.
Метод setup вызывается при установке плагина
в приложение и получает объект приложения. Метод
apply применяется к каждому обработчику
маршрута и позволяет обернуть его. Метод
close вызывается при удалении плагина
из приложения и служит для освобождения ресурсов.
Синтаксис
from bottle import Plugin
class MyPlugin(Plugin):
name = 'my-plugin'
api = 2
def setup(self, app):
pass
def apply(self, callback, route):
return callback
def close(self):
pass
Пример
Давайте создадим простой плагин, который логирует вызов каждого обработчика:
from bottle import Bottle, Plugin
class LogPlugin(Plugin):
name = 'log'
api = 2
def setup(self, app):
self.app = app
def apply(self, callback, route):
def wrapper(*args, **kwargs):
print('before:', route.rule)
res = callback(*args, **kwargs)
print('after:', route.rule)
return res
return wrapper
def close(self):
pass
app = Bottle()
app.install(LogPlugin())
@app.route('/')
def index():
return 'hello'
Результат выполнения кода для адреса /:
before: /
after: /
hello
Пример
Давайте создадим плагин, который добавляет префикс к результату каждого обработчика:
from bottle import Bottle, Plugin
class PrefixPlugin(Plugin):
name = 'prefix'
api = 2
def __init__(self, prefix):
self.prefix = prefix
def setup(self, app):
pass
def apply(self, callback, route):
def wrapper(*args, **kwargs):
res = callback(*args, **kwargs)
return self.prefix + res
return wrapper
def close(self):
pass
app = Bottle()
app.install(PrefixPlugin('>> '))
@app.route('/')
def index():
return 'hello'
Результат выполнения кода для адреса /:
>> hello
Пример
Давайте создадим плагин, который считает количество вызовов обработчиков:
from bottle import Bottle, Plugin
class CounterPlugin(Plugin):
name = 'counter'
api = 2
def setup(self, app):
self.count = 0
def apply(self, callback, route):
def wrapper(*args, **kwargs):
self.count += 1
return callback(*args, **kwargs)
return wrapper
def close(self):
print('total calls:', self.count)
app = Bottle()
plugin = CounterPlugin()
app.install(plugin)
@app.route('/')
def index():
return 'hello'
app.uninstall(plugin)
Результат выполнения кода:
total calls: 0