アーカイブ
はじめに
こんにちは新入社員のKです!
最近、業務でPHPでWebAPIを作成する機会があったのですが、WebAPIについて調べていると普段業務で使っているDjangoでは "Django Rest framework" というAPIを簡単に作成することができるライブラリがあるそうなので、今回そのライブラリを使ってAPIを実装してみようと思います!
Django Rest Frameworkにはチュートリアルがあるので、そちらを行ってみようと思います!
環境構築はDockerを使って行います!
環境
- OS: macOS
- Docker: 20.10.7
- Python: 3.10
- Django: 3.2
- djangorestframework: 3.13.1
- mysql: 8.0.13
- mysqlclient: 1.4.6
環境構築
Djangoの環境構築を行います!
環境構築に関して先日僕が書いた以下の記事を参考に構築します!
ただ、requirements.txtを以下のように変更してください。
Django==3.2
mysqlclient==1.4.6
djangorestframework==3.13.1
コンテナを立ち上げて、http://127.0.0.1:8000にアクセスしましょう。
Djangoのトップページが確認できたら環境構築完了です。
アプリの作成 + スーパーユーザーの作成 + migrationの実行
プロジェクトまで作りましたが、アプリをまだ作っていないのでアプリを作ります。
今回はapiという名前のアプリを作成します。
ターミナル(コマンドライン)で以下コマンドを実行します。
$docker-compose run --rm web django-admin startapp api
これでアプリが作成されていると思います。
次に管理画面にログインするためにスーパーユーザーを作成します。
以下コマンドを実行したら、ユーザー名、メールアドレス、パスワードを求められると思うので、任意のものを入力してください。
$docker-compose run --rm web python manage.py createsuperuser
最後にmigrationを行います。
以下の2つのコマンドを実行してください。
$docker-compose run --rm web python manage.py makemigrtions
$docker-compose run --rm web python manage.py migrate
こちらでmigrationは完了です。
API作成
ここからは実際にコードを書いていきます。
serializer.py
先ほど作成したapiアプリの中にserializer.pyを作成し、以下の記述をします。
from django.contrib.auth.models import User, Group
from rest_framework import serializers
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ['url', 'username', 'email', 'groups']
class GroupSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Group
fields = ['url', 'name']
views.py
次にViewを作成します。viewはstartappをした時に自動で作成されているのでそちらに記載していきます。
from rest_framework import viewsets
from rest_framework import permissions
from api.serializer import UserSerializer, GroupSerializer
from django.contrib.auth.models import User, Group
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all().order_by('-date_joined')
serializer_class = UserSerializer
permission_classes = [permissions.IsAuthenticated]
class GroupViewSet(viewsets.ModelViewSet):
queryset = Group.objects.all()
serializer_class = GroupSerializer
permission_classes = [permissions.IsAuthenticated]
ViewSetクラスはライブラリで用意されたクラスでユーザーに読み書き権限を与えるAPIエンドポイントのようです。
ここではこのAPIを利用するユーザーに対して、読み書き権限をどのように設定するかということを設定しているようです。
urls.py
次にURLを設定していきます。
ViewSetを使った場合はAPI用の設定を自動で生成することができ、viewsetsをrouterクラスに登録するだけで良いそうです。
from django.contrib import admin from django.urls import path, include from rest_framework import routers from api import views router = routers.DefaultRouter() router.register(r'users', views.UserViewSet) router.register(r'groups', views.GroupViewSet) urlpatterns = [ path('admin/', admin.site.urls), path('', include(router.urls)), path('api-auth/', include('rest_framework.urls', namespace='rest_framework')), ]
settings.py
最後にsettings.pyのINSTALLED_APPにrest_frameworkを追加します。
これをしないとrest_frameworkを認識してくれません。
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'api', 'rest_framework' ]
APIを実際に取得してみる
必要な実装はこれで完了なので実際にAPIを取得してみます!
今回はserializer.pyでdjango.contrib.auth.modelsのUserを指定しているので先ほど作成したスーパーユーザーを取得してみましょう。
以下のURLにアクセスします。
以上のように作成したスーパーユーザーの情報が取得できていたら完了です!
また、curlコマンドを利用してターミナルからも情報を取得してみましょう。
※curlコマンドとは様々なプロトコルを使用してデータ転送を行うものです。
$ curl -H 'Accept: application/json; indent=4' -u admin:[設定したパスワード] http://127.0.0.1:8000/users/ { "count": 1, "next": null, "previous": null, "results": [ { "url": "http://127.0.0.1:8000/users/1/", "username": "admin", "email": "hogehoge@hogehoge", "groups": [] } ] }
以上のようにターミナルからでもユーザー情報を取得することができました。
こちらでDjango Rest Frameworkのチュートリアルは完了です。
最後に
今回はDjango Rest Frameworkのチュートリアルを行いました。
一からAPIを実装しようとすると大変ですが、こちらを使えば簡単にAPIを実装できそうだと思いました。
今回はチュートリアルをそのまま捻りを加えず、行いましたが機会があれば関数ベースで実装してみたり、Viewsetを使わずに行ってみたりと
様々な方法で実装してみたいと思います。
最後まで読んで頂き、ありがとうございました。