この記事は最終更新日から1年以上が経過しています。
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年目で脱新人を目指してます。
フロントに興味を持ち始めた今日このごろ。
趣味は 麻雀 プログラミング 音楽。
運動不足を感じているため、ダンスを始めようかと思っています。
最近書いた記事
- 2019.06.26コンテナイメージの縮小
- 2019.05.27Chromeのユーザ切り替えで複数のAWS環境の管理をわかりやすくする
- 2019.04.15ECRのライフサイクルポリシー
- 2019.03.29KongでOAuth2の認証手順