django+DRF+openapi+aspida+swr
#django
背景
Django REST Frameworkでバックエンドを作成している
フロントエンドではTypescript+React+SWRを使っている
バックエンドでのモデル定義から、フロントのTypeScriptの型定義を生成したい。
方法
drf-spectacular を用いて、REST FrameworkのコードからOpenAPI Specを生成する。
openapi2aspida を用いて、OpenAPI Specから aspidaの型定義を生成する。
@aspida/swr を用いて、SWRに型定義を導入する
@stoplight/prism-cliを使い、openapi定義とバックエンド実装に乖離がないかを調べる
code:sh
npm i -g @stoplight/prism-cli
prism proxy http://localhost:8000/api/schema http://localhost:8000
発生した問題など
aspidaのリクエストにtrailing slashがつかない
Djangoでは、デフォルトでtrailing slashなしをslashありにリダイレクトするので、相性が悪い。
aspida.config.js にて設定可能
openapi2aspida がreadOnlyを見てくれない問題
Issueも上がっている
Support readOnly / writeOnly fields in Schema Object · Issue #239 · aspida/openapi2aspida · GitHub
なので、POSTなどの更新リクエストを送ろうとすると型エラーを発してしまう
drf-specutacular側で、readOnlyを見れないクライアント用のコードを生成するオプションを用意してくれている。これを使えば解決。
Client generation — drf-spectacular documentation
@aspida/swr に useSWRInfinite とかがない。
Pull requestを投げている人はいる
feat(aspida-swr): add useAspidaSWRInfinite hook by kotarella1110 · Pull Request #678 · aspida/aspida · GitHub
今のところこれに関しては手で型定義をしてる。