|
| 1 | +--- |
| 2 | +title: カスタムのアダプター |
| 3 | +lang: ja-jp |
| 4 | +slug: custom-adapters |
| 5 | +order: 1 |
| 6 | +--- |
| 7 | + |
| 8 | +<div class="section-content"> |
| 9 | +[アダプター](#adapters)はフレキシブルで、あなたが使用したいフレームワークに合わせた調整も可能です。アダプターでは、次の 2 つの要素が必須となっています。 |
| 10 | + |
| 11 | +- `__init__(app:App)` : コンストラクター。Bolt の `App` のインスタンスを受け取り、保持します。 |
| 12 | +- `handle(req:Request)` : Slack からの受信リクエストを受け取り、解析を行う関数。通常は `handle()` という名前です。リクエストを [`BoltRequest`](https://github.com/slackapi/bolt-python/blob/main/slack_bolt/request/request.py) のインスタンスに合った形にして、保持している Bolt アプリに引き渡します。 |
| 13 | + |
| 14 | +`BoltRequest` のインスタンスの作成では、以下の 4 種類のパラメーターを指定できます。 |
| 15 | + |
| 16 | +| パラメーター | 説明 | 必須 | |
| 17 | +|-----------|-------------|-----------| |
| 18 | +| `body: str` | そのままのリクエストボディ | **Yes** | |
| 19 | +| `query: any` | クエリストリング | No | |
| 20 | +| `headers:Dict[str, Union[str, List[str]]]` | リクエストヘッダー | No | |
| 21 | +| `context:BoltContext` | リクエストのコンテキスト情報 | No | |
| 22 | + |
| 23 | +アダプターは、Bolt アプリからの [`BoltResponse` のインスタンス](https://github.com/slackapi/bolt-python/blob/main/slack_bolt/response/response.py)を返します。 |
| 24 | + |
| 25 | +カスタムのアダプターに関連した詳しいサンプルについては、[組み込みのアダプター](https://github.com/slackapi/bolt-python/tree/main/slack_bolt/adapter)の実装を参考にしてください。 |
| 26 | +</div> |
| 27 | + |
| 28 | +```python |
| 29 | +# Flask で必要なパッケージをインポートします |
| 30 | +from flask import Request, Response, make_response |
| 31 | + |
| 32 | +from slack_bolt.app import App |
| 33 | +from slack_bolt.request import BoltRequest |
| 34 | +from slack_bolt.response import BoltResponse |
| 35 | + |
| 36 | +# この例は Flask アダプターを簡略化したものです |
| 37 | +# もう少し詳しい完全版のサンプルは、adapter フォルダをご覧ください |
| 38 | +# github.com/slackapi/bolt-python/blob/main/slack_bolt/adapter/flask/handler.py |
| 39 | + |
| 40 | +# HTTP リクエストを取り込み、標準の BoltRequest に変換します |
| 41 | +def to_bolt_request(req:Request) -> BoltRequest: |
| 42 | + return BoltRequest( |
| 43 | + body=req.get_data(as_text=True), |
| 44 | + query=req.query_string.decode("utf-8"), |
| 45 | + headers=req.headers, |
| 46 | + ) |
| 47 | + |
| 48 | +# BoltResponse を取り込み、標準の Flask レスポンスに変換します |
| 49 | +def to_flask_response(bolt_resp:BoltResponse) -> Response: |
| 50 | + resp:Response = make_response(bolt_resp.body, bolt_resp.status) |
| 51 | + for k, values in bolt_resp.headers.items(): |
| 52 | + for v in values: |
| 53 | + resp.headers.add_header(k, v) |
| 54 | + return resp |
| 55 | + |
| 56 | +# アプリからインスタンス化します |
| 57 | +# Flask アプリを受け取ります |
| 58 | +class SlackRequestHandler: |
| 59 | + def __init__(self, app:App): |
| 60 | + self.app = app |
| 61 | + |
| 62 | + # Slack からリクエストが届いたときに |
| 63 | + # Flask アプリの handle() を呼び出します |
| 64 | + def handle(self, req:Request) -> Response: |
| 65 | + # この例では OAuth に関する部分は扱いません |
| 66 | + if req.method == "POST": |
| 67 | + # Bolt へのリクエストをディスパッチし、処理とルーティングを行います |
| 68 | + bolt_resp:BoltResponse = self.app.dispatch(to_bolt_request(req)) |
| 69 | + return to_flask_response(bolt_resp) |
| 70 | + |
| 71 | + return make_response("Not Found", 404) |
| 72 | +``` |
0 commit comments