Swagger Yamlからコントローラ・ルーティング・バリデータ・シリアライザ・デシリアライザ・セキュリティサービスを動的に提供するConnexionは,APIファーストな開発におけるプロダクトのインフラストラクチャレイヤに最適なライブラリである.しかし,細部の挙動をカスタマイズしたい場合がある.その場合のメモ.
1. FlaskApp.add_api()
2. FlaskApi.__init__()
3. ResolverがYAMLファイルパース
4. FlaskApi.add_paths()
5. each path each (method, endpoint) self.add_operation()
6. Operation.__init__()
7. Resolver.__init__()
8.self.resolve_function_from_operation_id(operation_id)
8. FlaskApi._add_operation_internal
9. FlaskApi.blueprint.add_url_map(operation.function)
1. Flask.app.dispatch_request
2. invoke Operation.function
3. EndOfRequestLifecycleDecorator から FlaskApi.get_request
注1) https://github.com/pallets/flask/blob/master/flask/app.py#L1725
https://github.com/zalando/connexion/blob/master/connexion/decorators/parameter.py
parameter_to_argデコレータは厄介. なぜなら,handle対象の引数でない値の削除が行われてしまうから. しかし,コンテキストに存在する限りは削除されないので,基本的なデータストアはコンテキストを対象にすると良さそう また,kwargsは削除されないので,これを再度注入することもできる.
- Resolver.resolve(), CustomResolverは誰でも定義するはず.undecorated_function が得られる.
- FlaskApi.get_request, ただし classmethod. FlaskAppもオーバライドする必要がある.EndOfRequestLifecycleDecoratorがInvokeするので,undecorated_function が得られる
- FlaskApi._add_operation_internal ただし,Operation.function が得られる
- Operation._request_begin_lifecycle_decorator or Operation._request_begin_lifecycle_decorator ただし FlaskApi.add_operation をオーバライドする必要がある.
ビュー関数がflask.gを弄ってよいのであれば,flask.gを使うべき.