Django

【Django環境備忘録#2】Django RESTAPI Frameworkを用いてREST APIを作成するまで

ここでは、Django RESTAPI Frameworkを用いてREST APIを作成する方法についてまとめておきます。
基本的には備忘録となります。

今回紹介する設定は、

 ・Django RESTAPI Framework のインストールからセットアップ
 ・カスタムコマンドの作成
 ・マイグレーションやユーザ作成のMakefile作成


となります。

前提となる環境は、以下の記事に記載のセットアップが完了した直後の状態となります。

前回までのファイル構成は以下のとおりです。

[開発用ディレクトリ]
 |-[YourProjectName]
   |-[YourProjectName]
     |-省略
   |-[YourAppName]
    |-省略
 |-Pipfile
 |-Pipfile.lock
 |-requirements.txt
 |-Makefile
 |-.git
 |-.gitignore

また、前回までにインストールしたモジュールは以下のとおりです。

 ・django
 ・django-debug-toolbar

もくじ

  1. Django REST frameworkのインストール
  2. データベースのマイグレーション
  3. カスタムコマンドの作成方法
  4. スーパーユーザの作成
  5. Django REST frameworkのセットアップ
  6. まとめ

Django REST frameworkのインストール

基本的には公式のDjango REST framework ドキュメントを参照しています。

まずは必要なモジュールのインストールから。
ちなみに、Django REST frameworkの動作には以下のバージョンが必須のようです。

・Python (3.5, 3.6, 3.7, 3.8)
・Django (1.11, 2.0, 2.1, 2.2, 3.0)

インストールは以下のコマンドで実行できます。
requirements.txtへの反映も忘れずに。

pip install djangorestframework
pip install markdown
pip install django-filter

pip freeze > requirements.txt

データベースのマイグレーション

次は、DBのマイグレーションです。
Makefileに以下のコマンドを追記してください。

migrate: ## Create migration file and do migrate
	python3 ./[YourProjectName]/manage.py makemigrations
	python3 ./[YourProjectName]/manage.py migrate

これを実行すると、DBのマイグレーションが完了します。

カスタムコマンドの作成方法

さて、次はDjangoの管理サイトを使用できるスーパーユーザを作成します。
ですが、デフォルトで実装されているcreatesuperuserコマンドは、毎回登録情報を入力する必要があるので面倒です。

そのため、今回はスーパーユーザの作成を簡略化するためのカスタムコマンドを作成して、ワンライナーでスーパーユーザを作成できるようにします。

カスタムコマンドとは、manage.pyで実行できるコマンドを自分で作成できるようにしたものです。
アプリケーションディレクトリ配下に[management/commands]ディレクトリを作成し、その中にPythonスクリプトを配置することで作成できます。

今回は、custom_create_superuser.pyを作成します。
作成したファイルには、以下のスクリプトを入力してください。
こちらのサイトで紹介されていたスクリプトのタイポなどを一部修正したものになります。

from django.contrib.auth.management.commands import createsuperuser
from django.core.management import CommandError


class Command(createsuperuser.Command):
    help = 'Create a superuser with a password non-interactively'

    def add_arguments(self, parser):
        super(Command, self).add_arguments(parser)
        parser.add_argument(
            '--password', dest='password', default=None,
            help='Specifies the password for the superuser.',
        )

    def handle(self, *args, **options):
        options.setdefault('interactive', False)
        username = options.get('username')
        email = options.get('email')
        password = options.get('password')
        database = options.get('database')

        if not (username and email and password):
            raise CommandError('--username, --email and --password are required options')

        user_data = {
            'username': username,
            'email': email,
            'password': password,
        }

        exists = self.UserModel._default_manager.db_manager(database).filter(username=username).exists()
        if not exists:
            self.UserModel._default_manager.db_manager(database).create_superuser(**user_data)

これで、python3 manage.py helpを実行すると、作成したコマンドが登録されていることが確認できます。

ここまでにディレクトリツリーは以下のようになっているかと思います。

[開発用ディレクトリ]
 |-[YourProjectName]
   |-[YourProjectName]
     |-省略
   |-[YourAppName]
    |-省略
    |-migrations
    |-management
       |-comands
         |-custom_create_superuser.py
 |-Pipfile
 |-Pipfile.lock
 |-requirements.txt
 |-Makefile
 |-.git
 |-.gitignore

スーパーユーザの作成

無事にカスタムコマンドも作成できたので、いよいよスーパーユーザを作成…、の前にMakefileを編集しておきましょう。
以下をMakefileに追記してください。

name=admin
email=sample@testmail.org
passwd=Passw0rd
create_custom_superuser: ## This is create super user for 1line, need name,email,passwd(default=admin,sample@testmail.org,Passw0rd)
	python3 ./mocrat_bot/manage.py custom_create_superuser --username ${name} --email ${mail} --password ${passwd}

このMakefileを使えば、今後のスーパーユーザの作成が簡単になります。

Django REST frameworkのセットアップ

さて、ここまでで準備が完璧に整ったので、本題であるDjango REST frameworkをのセットアップをやっていきます。
すでにインストールは完了しているので、以下のステップで進めます。

1.INSTALLED_APPSに追記する。
言わずもがなですが、INSTALLED_APPSにrest_frameworkを追記しておきましょう。

INSTALLED_APPS = [
    ...
    'rest_framework',
]

2.[YourAppName]側のUrlsを差し替える
次に、アプリケーション側のUrlsを編集します。
前回までにViewsのindexにアクセスするスクリプトを書きましたが、あれはもう使わないので全部差し替えましょう。

以下のスクリプトを貼り付けます。

from django.urls import include, path
from rest_framework import routers
from . import views

router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet)

urlpatterns = [
    path('', include(router.urls)),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

3.Settingsを編集する
次に、Settingsの末尾に以下の設定を貼り付けてください。

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10
}

4.Serializer.pyを作成する
Django REST frameworkをのセットアップ完了まであと少しです!

アプリケーションディレクトリの配下に、serializer.pyを作成して、以下のスクリプトを貼り付けてください。
アプリケーションディレクトリとは[YourAppName]ディレクトリの下です。間違えないように。

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']

5.Viewsを差し替える
これが最後のステップです!

アプリケーションディレクトリ配下のViewsを以下のスクリプトに差し替えましょう。
前回作成したIndexが書かれているかと思いますが、全部差し替えてしまって問題ありません。

from django.contrib.auth.models import User, Group
from rest_framework import viewsets
from rest_framework import permissions
from .serializers import UserSerializer, GroupSerializer


class UserViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    queryset = User.objects.all().order_by('-date_joined')
    serializer_class = UserSerializer
    permission_classes = [permissions.IsAuthenticated]


class GroupViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows groups to be viewed or edited.
    """
    queryset = Group.objects.all()
    serializer_class = GroupSerializer
    permission_classes = [permissions.IsAuthenticated]

6.APIをテストしよう
セットアップお疲れ様でした。

最後に、Django REST frameworkが動作するかどうかテストをしましょう。
まずは、make runserverでDjangoを起動してください。

次に、別のコンソールから、以下のスクリプトを実行してください。
[admin:Passw0rd]の部分とポートの部分は、自分で設定したものがあれば、そちらを指定してください。

curl -H 'Accept: application/json; indent=4' -u admin:Passw0rd http://127.0.0.1:8080/users/

これを実行して、以下のようなレスポンスが確認できれば成功です!

{
  "count": 1,
  "next": null,
  "previous": null,
  "results": [
      {
          "url": "http://127.0.0.1:8080/users/1/",
          "username": "admin",
          "email": "test@samplemail.org",
          "groups": []
      }
  ]
}

まとめ

今回はDjango REST frameworkを使えるようにするところまでセットアップしました。
次はデプロイするところまでのまとめになるかなと思います。

COMMENT

メールアドレスが公開されることはありません。