django-rest-frameworkのチュートリアルを超意訳してみた。すなぶろスマートフォン用の表示で見るすなぶろPythonistaを目指しているつもりが、Hyのおかげで無事脱線。Clojurian目指すことになりました。この広告は、90日以上更新していないブログに表示しています。2017-10-05django-rest-frameworkのチュートリアルを超意訳してみた。pythonこのあいだ自分がプライベートで運営している動画サイトにAPIが欲しかったので、django-rest-frameworkを使ってみました。日本語の資料が少なかったので、布教目的でここに置いておきます。欲しかった機能はこんな感じ。多対多(ManyToMany)でよろしくやる登録ユーザのみ許可する認証処理pythonスクリプトからAPIを使う(おまけ)可能なのかどうか半信半疑で使ってみましたが、チュートリアルに全部書いてあったので参考になれば。ViewSetとRouterRESTフレームワークにはViewSetと呼ばれる抽象構造が含まれており、開発者がAPIの状態や操作のモデリングに集中できるよう、URLを一般的な規約に基いたものに自動構築させることができます。ViewSetクラスはViewクラスとほとんど同じですが、getやputといったメソッドハンドラではなく、readやupdateなどのオペレーションを提供します。ViewSetクラスが一連のメソッドハンドラに割り当てられるのはビューにインスタンス化される瞬間のみで、通常これは複雑なURLconfを定義するRouterクラスを介して行われます。ViewSetを使うようリファクタリングする現在のビューをViewSetに落とし込んでみましょう。UserListとUserDetailを単一のUserViewSetにリファクタリングします。2つのビューを削除し、1つのクラスに置き換えましょう。UserSerializerここではReadOnlyModelViewSetクラスを使って、デフォルトの「読み取り専用」オペレーションを自動的に定義しています。querysetとserializer_class属性は通常のViewを使っていたときと同じく設定していますが、同じ情報を2つのクラスそれぞれに提供する必要はなくなりました。SnippetHighlightクラスを置き換えます。3つのビューを削除して、やはり1つのクラスに書き直しましょう。serializer.save(owner=self.request.user)こちらではModelViewSetクラスを使うことで、デフォルトの「読み書き可能」オペレーションを網羅しています。@detail_routeデコレータを併用してhighlightという名前のカスタムアクションを作成しました。deleteスタイルに合致しないカスタムエンドポイントを定義することができます。@detail_routeデコレータを使用するカスタムアクションは、デフォルトでGETリクエストに対応します。POSTリクエストに対応させたい場合はmethods引数を指定してください。カスタムアクションのURLには、デフォルトではメソッド名そのものが割り当てられます。URLパターンの構築方法を変更する場合は、デコレータのキーワード引数にurl_pathを指定してください。URLの明示的な割り当てURLconfを定義すると、ハンドラメソッドはアクションにのみ割り当てられます。内部的には何が行われているのでしょうか。ViewSetを明示的にビューに変換してみましょう。urls.pyファイルで、ViewSetクラスを実際のビューに割り当てます。'retrieve'})各ViewSetクラスからどのように複数のビューを切り出しているのか見てみると、httpメソッドを各ビューの対応するアクションに割り当てていることがわかります。これでリソースが実際のビューに割り当てられました。いつも通りビューをURLconfに登録しましょう。name='user-detail')])Routerを使うViewクラスではなくViewSetクラスを使用しているため、実は手動でURLを設計する必要はありません。リソースをビュー・URLに関連付けるための規約はRouterクラスを使って自動的に処理させることができます。適切なViewSetをRouterに登録してしまえば、あとはお任せです。こちらがスリムになったurls.pyファイルです。namespace='rest_framework'))]ViewSetをRouterに登録するのはurlpatternを定義するのに似ており、ビューのURLプレフィックスとViewSetそのものの2つの引数が含まれています。DefaultRouterクラスは自動的にAPIルートビューを作成するので、viewsモジュールからapi_rootメソッドを削除することができます。どっちがいいの?ViewSetを使えば非常に便利な抽象構造を手に入れられます。URLの規約がAPI全体を通して一貫していることが保証され、書くコードの量は最小限になり、URLconfの仕様とにらめっこするのではなく、APIが提供する処理や形式だけに集中することができます。それが常に正しいアプローチであるとは限りません。関数ベースのビューとクラスベースのビュー、どちらを使うべきかという問題にも似ていて、いずれもトレードオフを考慮する必要があります。ViewSetを使う場合、ビューを個別に作成するよりも明示性で劣るとも言えます。第07回ではAPIスキーマを追加する方法や、構築したAPIに対するクライアントライブラリ・コマンドラインツールからのアクセス方法を見ていきます。16:20django-rest-frameworkのチュートリアルを超意訳してみた。第06回「ViewSetとRouter」Tweet広告を非表示にする関連記事2017-10-06django-rest-frameworkのチュートリアルを超意訳してみた。第07回「スキーマとクラ...このあいだ自分がプライベートで運営している動画サイトにAPIが...2017-10-04django-rest-frameworkのチュートリアルを超意訳してみた。第05回「リレーションシ...このあいだ自分がプライベートで運営している動画サイトにAPIが...2017-10-03django-rest-frameworkのチュートリアルを超意訳してみた。第04回「認証と許可」このあいだ自分がプライベートで運営している動画サイトにAPIが...2017-10-02django-rest-frameworkのチュートリアルを超意訳してみた。第03回「クラスベースの...このあいだ自分がプライベートで運営している動画サイトにAPIが...2017-10-01django-rest-frameworkのチュートリアルを超意訳してみた。ヶ月)実践CommonLispをちょっとだけ翻訳した人。AIブームもっかい来ないかなと思ってたら本当に来て引く。好きな言語はClojureです。Part2はてなブログをはじめよう!sandmarkさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。