###はじめに
Django REST Framework(DRF)を使ってDockerコンテナ上で簡単なHello World APIを作ります。
ローカルを汚さないため、コーディングもコンテナ上で行おうと思います。
何度でもやり直せる気軽な開発環境のイメージです。
##Django REST Frameworkとは
PythonのWebアプリケーションフレームワークであるDjangoを使ってAPIを開発するために利用されるライブラリです。
活用できればRESTfulなAPIの開発をサクッと簡単に(←重要)行えます。
- 公式ドキュメント:Django REST Framework
##環境
- Windows 10 Pro(20H2)
- Docker Desktop:3.1.0(51484)
- VSCode:1.53.2
##0. 準備(必要であれば)
コンテナ上でコーディングを行うため、VSCodeに Remote - Containers
拡張機能をインストールします。
##1. Dockerイメージビルド
Django
djangorestframework
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イメージをビルド
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番にマッピングします。
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...
を押下
先程起動したコンテナが出てくるので押下すると、新しくVSCodeのウィンドウが立ち上がり、
コンテナ内にアクセスすることができます。
VSCode上でCtrl + Shift + @
でターミナルを開き/opt
でDjangoプロジェクトを作成後、プロジェクト内に移動しDjangoアプリを作成します。
[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ディスパッチャをそれぞれ編集します。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework', # 追加
]
"""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
を編集します。
from django.urls import path
from . import views
app_name = 'hello'
urlpatterns = [
path('', views.hello_world),
]
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内蔵サーバで起動させます。
[root@e81d8fcebd80 sampleproject]# python3 /opt/sampleproject/manage.py runserver 0.0.0.0:8000
##5. 動作確認
http://localhost:8090/hello にブラウザでアクセスします。もちろんcurl
でも可です。
この画面が表示されればOKです!
今回はあまりうまみが無いですが、管理コンソールを使いこなすとかなりAPI開発が捗ります。
ちなみに生のJSONを確認したいときは http://localhost:8090/hello?format=json とすれば良いです。
##まとめ
お疲れ様でした。
Django REST Framework を活用してかなりサクッとAPIを実装することができました。
CRUDも含むRESTful-APIの実装や、プロダクションを意識したWeb/WSGIサーバの導入はまた別記事に書こうと思います。
##参考URL