0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Django REST Framework on Docker でHello World APIをサクッと作る

Last updated at Posted at 2021-02-23

###はじめに
Django REST Framework(DRF)を使ってDockerコンテナ上で簡単なHello World APIを作ります。
ローカルを汚さないため、コーディングもコンテナ上で行おうと思います。
何度でもやり直せる気軽な開発環境のイメージです。

##Django REST Frameworkとは
PythonのWebアプリケーションフレームワークであるDjangoを使ってAPIを開発するために利用されるライブラリです。
活用できればRESTfulなAPIの開発をサクッと簡単に(←重要)行えます。

##環境

  • Windows 10 Pro(20H2)
  • Docker Desktop:3.1.0(51484)
  • VSCode:1.53.2

##0. 準備(必要であれば)
コンテナ上でコーディングを行うため、VSCodeに Remote - Containers 拡張機能をインストールします。
remote.png

##1. Dockerイメージビルド

requirements.txt
Django
djangorestframework
dockerfile
FROM centos

RUN yum -y groupinstall "development tools" \
&& yum -y install \
           wget \
           zlib-devel \
           openssl \
           openssl-devel \
           sqlite \
           sqlite-devel \
&& cd /opt \
&& wget https://www.python.org/ftp/python/3.9.2/Python-3.9.2.tgz \
&& tar xzvf Python-3.9.2.tgz \
&& cd ./Python-3.9.2 \
&& ./configure --with-threads && make install && make clean \
&& rm -rf /opt/Python-3.9.2.tgz \
&& ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

COPY ./requrements.txt /opt/
RUN pip3 install --no-cache-dir -r /opt/requrements.txt

↑二つを同階層に置き、そのディレクトリでDockerイメージをビルド

powershell
PS C:\Users\sakimura\Documents\Programs> docker build . -t django_hello
[+] Building 1.1s (9/9) FINISHED
 => [internal] load build definition from Dockerfile                                                               0.0s
 => => transferring dockerfile: 644B                                                                               0.0s
 => [internal] load .dockerignore                                                                                  0.0s
 => => transferring context: 2B                                                                                    0.0s
 => [internal] load metadata for docker.io/library/centos:latest                                                   0.0s
 => [1/5] FROM docker.io/library/centos                                                                            0.0s
 => [internal] load build context                                                                                  0.0s
 => => transferring context: 70B                                                                                   0.0s
 => CACHED [2/5] RUN yum -y groupinstall "development tools"                                                       0.0s
 => CACHED [3/5] RUN yum -y install            wget            zlib-devel            openssl            openssl-d  0.0s
 => [4/5] COPY ./requirements.txt /opt/                                                                            0.0s
 => ERROR [5/5] RUN pip3 install --no-cache-dir -r /opt/requrements.txt                                            0.9s
------
 > [5/5] RUN pip3 install --no-cache-dir -r /opt/requrements.txt:
#9 0.637 ERROR: Could not open requirements file: [Errno 2] No such file or directory: '/opt/requrements.txt'
#9 0.843 WARNING: You are using pip version 20.2.3; however, version 21.0.1 is available.
#9 0.843 You should consider upgrading via the '/usr/local/bin/python3.9 -m pip install --upgrade pip' command.
------
executor failed running [/bin/sh -c pip3 install --no-cache-dir -r /opt/requrements.txt]: exit code: 1
PS C:\Users\sakimura\Documents\Programs> docker build . -t django_hello
[+] Building 13.0s (10/10) FINISHED
 => [internal] load build definition from Dockerfile                                                               0.0s
 => => transferring dockerfile: 645B                                                                               0.0s
 => [internal] load .dockerignore                                                                                  0.0s
 => => transferring context: 2B                                                                                    0.0s
 => [internal] load metadata for docker.io/library/centos:latest                                                   0.0s
 => [1/5] FROM docker.io/library/centos                                                                            0.0s
 => [internal] load build context                                                                                  0.0s
 => => transferring context: 37B                                                                                   0.0s
 => CACHED [2/5] RUN yum -y groupinstall "development tools"                                                       0.0s
 => CACHED [3/5] RUN yum -y install            wget            zlib-devel            openssl            openssl-d  0.0s
 => CACHED [4/5] COPY ./requirements.txt /opt/                                                                     0.0s
 => [5/5] RUN pip3 install --no-cache-dir -r /opt/requirements.txt                                                12.1s
 => exporting to image                                                                                             0.8s
 => => exporting layers                                                                                            0.8s
 => => writing image sha256:adc1814ea2869e74515c44a91d91bb408c5af97a9d68309eea1368b3c0222130                       0.0s
 => => naming to docker.io/library/django_hello                                                                    0.0s

プロキシ環境下の場合、--build-arg http_proxy/https_proxy が必要な場合もあります。

##2. Dockerコンテナ起動
ビルドしたイメージからコンテナを起動します。
今回はコンテナの8000番ポートをホストの8090番にマッピングします。

powershell
PS C:\Users\sakimura\Documents\Programs> docker run -itd -p 8090:8000 --name django_hello django_hello
069eb3777790f092bcd8825ce2b3352f939876e17ddb06e85d85775c6baa3cfd
PS C:\Users\sakimura\Documents\Programs> docker ps
CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS          PORTS                    NAMES
e81d8fcebd80   django_hello   "/bin/bash"   49 seconds ago   Up 49 seconds   0.0.0.0:8090->8000/tcp   django_hello

##3. API作成
左下のOpen a remote windowを押下、
その後Remote-Containers: Attach to Running Container...を押下
キャプチャ.PNG

先程起動したコンテナが出てくるので押下すると、新しくVSCodeのウィンドウが立ち上がり、
コンテナ内にアクセスすることができます。
container.png

VSCode上でCtrl + Shift + @でターミナルを開き/optでDjangoプロジェクトを作成後、プロジェクト内に移動しDjangoアプリを作成します。

bash
[root@e81d8fcebd80 opt]# pwd
/opt
[root@e81d8fcebd80 opt]# django-admin startproject sampleproject
[root@e81d8fcebd80 opt]# cd sampleproject
[root@e81d8fcebd80 sampleproject]# django-admin startapp hello 

プロジェクトディレクトリのDjango設定ファイル、URLディスパッチャをそれぞれ編集します。

/opt/sampleproject/sampleproject/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework', # 追加
]
/opt/sampleproject/sampleproject/urls.py
"""sampleproject URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/3.1/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.conf.urls import include, url # 追加
from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^hello', include('hello.urls', namespace='hello')), # 追加
]

アプリケーションディレクトリのURLディスパッチャを新規作成の上、views.pyを編集します。

/opt/sampleproject/hello/urls.py
from django.urls import path
from . import views
 
app_name = 'hello'
urlpatterns = [
    path('', views.hello_world),
]
/opt/sampleproject/hello/views.py
from rest_framework.response import Response
from rest_framework.decorators import api_view

@api_view(['GET'])
def hello_world(request):
    return Response({"message": "Hello, world!"})

##4. API起動
準備ができたので、ターミナルで以下コマンドを実行し、Django内蔵サーバで起動させます。

bash
[root@e81d8fcebd80 sampleproject]# python3 /opt/sampleproject/manage.py runserver 0.0.0.0:8000

##5. 動作確認
http://localhost:8090/hello にブラウザでアクセスします。もちろんcurlでも可です。
200.png
この画面が表示されればOKです!
今回はあまりうまみが無いですが、管理コンソールを使いこなすとかなりAPI開発が捗ります。

ちなみに生のJSONを確認したいときは http://localhost:8090/hello?format=json とすれば良いです。
rawJSON.png

##まとめ
お疲れ様でした。
Django REST Framework を活用してかなりサクッとAPIを実装することができました。
CRUDも含むRESTful-APIの実装や、プロダクションを意識したWeb/WSGIサーバの導入はまた別記事に書こうと思います。

##参考URL

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?