Skip to content

Instantly share code, notes, and snippets.

@a-r-g-v
Created December 24, 2017 13:56
Show Gist options
  • Save a-r-g-v/4fb386cf05a21e0c75117a49fd9a8af8 to your computer and use it in GitHub Desktop.
Save a-r-g-v/4fb386cf05a21e0c75117a49fd9a8af8 to your computer and use it in GitHub Desktop.
Connexionに関するメモ

Connexion Memo

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は削除されないので,これを再度注入することもできる.

ビュー関数のフックの余地(簡単な順)

  1. Resolver.resolve(), CustomResolverは誰でも定義するはず.undecorated_function が得られる.
  2. FlaskApi.get_request, ただし classmethod. FlaskAppもオーバライドする必要がある.EndOfRequestLifecycleDecoratorがInvokeするので,undecorated_function が得られる
  3. FlaskApi._add_operation_internal ただし,Operation.function が得られる
  4. Operation._request_begin_lifecycle_decorator or Operation._request_begin_lifecycle_decorator ただし FlaskApi.add_operation をオーバライドする必要がある.

ビュー関数をフックしない場合

ビュー関数がflask.gを弄ってよいのであれば,flask.gを使うべき.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment