Lambdaで共通処理の続きです。 デコレーターで共通処理が行えるようになったので、共通処理をプラグイン化しました。 これで、デコレーターに プラグイン情報(クラス情報)を定義することで既存のコードを変更せずに、処理を追加できるようになりました。
デコレーターの実装
from common.plugin import Plugin
plugins = [
{
'from': 'common.plugin.hello_plugin',
'class_name': 'HelloPlugin'
}
]
plugin_instances = None
def load_plugins():
global plugin_instances
if plugin_instances is not None:
return
plugin_instances = []
for plugin in plugins:
mod = __import__(plugin['from'], fromlist=[plugin['class_name']])
cls = getattr(mod, plugin['class_name'])
obj = cls()
if issubclass(obj.__class__, Plugin):
plugin_instances.append(obj)
else:
raise TypeError()
def pre_processing(data):
if plugin_instances is None:
return data
for plugin in plugin_instances:
data = plugin.pre_processing(data)
return data
def post_processing(response):
if plugin_instances is None:
return response
for plugin in plugin_instances:
response = plugin.post_processing(response)
return response
def decorator(func):
import functools
@functools.wraps(func)
def wrapper(*args, ** kwargs):
data = pre_processing({'event': args[0], 'context': args[1]})
response = func(*(data['event'], data['context']), **kwargs)
response = post_processing(response)
return response
return wrapper
__init__.py でモジュールの初期化
from common.decorator import *
load_plugins()
プラグインの基底クラス実装
from abc import ABCMeta, abstractmethod
class Plugin(metaclass=ABCMeta):
@abstractmethod
def pre_processing(self, data):
pass
@abstractmethod
def post_processing(self, response):
pass
全てのレスポンスボディを ‘Hello World’ にするプラグインの実装
import json
from common.plugin import Plugin
class HelloPlugin(Plugin):
def __init__(self):
pass
def pre_processing(self, data):
pass
def post_processing(self, response):
return response['body'] = 'Hello World'
高橋克幸
新卒3年目で脱新人を目指してます。
フロントに興味を持ち始めた今日このごろ。
趣味は 麻雀 プログラミング 音楽。
運動不足を感じているため、ダンスを始めようかと思っています。