Oracle Cloud Hangout Cafe Season6 #4「Pythonで作るAPIサーバー」(2022年12月7日開催)

2024年3月21日(木)
野中 恭大郎
第2弾の連載第4回では、2022年12月7日に開催された 「Oracle Cloud Hangout Cafe Season6 #4『Pythonで作るAPIサーバー』」の発表内容に基づいて紹介していきます。

PythonのWebフレームワーク

Pythonの実行を確認できたので、次は実際にフレームワークを用いながら解説していきます。今回は3つのフレームワークを取り上げます。フレームワークの全体観としては下図の通りです。

ここからは、それぞれのフレームワークについて詳しく見ていきましょう。

Django

Djangoはアメリカのカンザス州・ローレンスにある新聞社のWeb部門であるWorld Onlineで開発されたフレームワークです。現在はボランティアチームによって運営されています。そして、オープンソースライセンス(BSDライセンス)の元で利用できます。

MTVアーキテクチャというものを採用しており、MTVのそれぞれの意味は、次のようになっています。MVCモデルで言うControllerの機能はフレームワークに内包(urls.pyによってルーティングを記述)されています。

  • Model: データを取得
  • Template: どのようにデータを表示するかを規定
  • View: どのデータを表示するかを規定

・Django - Getting Started
それでは、Djangoを実際に動かしてみましょう。まずは、簡単に動かしてみます。 Djangoのインストール

$ sudo python -m pip install Django
バージョンの確認
$ python -m django --version
以下のように記述したhello.pyを用意
import django
print(django.get_version())
実行
$ python hello.py

簡単にDjangoを動かすことができましたね。実際にDjangoを使う際は、後述のDjangoプロジェクトを用いて開発を進めていくことになります。

・Djangoプロジェクトの作成
Djangoプロジェクトの管理が行えるdjango-adminコマンドを利用して、Djangoプロジェクトを作成します。

$ django-admin startproject mysite
プロジェクトが生成されます。
$ tree mysite/
mysite/
├── manage.py
└── mysite
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    ├── asgi.py
    └── wsgi.py
  • 外側のmysite/: プロジェクトのルートディレクトリ
  • manage.py: Djangoプロジェクトを操作するためのコマンドラインユーティリティ
  • 内側のmysite/: このプロジェクトの実際のPythonパッケージ
  • __init__.py: このディレクトリがPythonパッケージであることをPythonに知らせるための空のファイル
  • settings.py: Djangoプロジェクトの設定ファイル
  • urls.py: DjangoプロジェクトのURL宣言
  • asgi.py: ASGI互換Webサーバーのエントリポイント
    • WSGI(Web Server Gateway Interface): Pythonにおける、WebアプリケーションとWebサーバ等を接続する標準仕様で、ゲートウェイ的な役割
  • wsgi.py: WSGI互換Webサーバーのエントリーポイント
    • WSGIはASGI(Asynchronous Server Gateway Interface)の後継仕様で、WebSocketと非同期通信をサポート
Djangoプロジェクト(サーバ)を起動します。
$ cd mysite/
$ python manage.py runserver <IP:port> #IP:portはオプション
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
February 19, 2024 - 06:32:42
Django version 3.2.24, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

開発用サーバが起動します。ブラウザで http://127.0.0.1:8000/ にアクセスすると画面を確認できます。

・Djangoアプリケーション
Djangoは、1つのプロジェクトに複数のアプリケーションを持つ構成です。

  • プロジェクトでは、どのアプリケーションにルーティングするかを管理
  • アプリケーションでは、どの関数にルーティングするかを管理
Djangoアプリケーションを作成する場合のコマンドは、以下の通りです。
$ python manage.py startapp <app name>
このコマンドを実行すると、<app name>で指定したディレクトリとボイラープレートコードが作成されます。
$ tree <app name>
<app name>
├── admin.py
├── apps.py
├── __init__.py
├── migrations
│   └── __init__.py
├── models.py
├── tests.py
└── views.py

・Djangoで簡単なAPIを作成
それでは、実際にDjangoで簡単なAPIを作成してみます。前述の通りDjangoはMTVで動作しますが、その中のTemplate(どのようにデータを表示するか)はUIに関連するため、APIの作成は不要です。templateを介さずにデータをやり取りする形式です。

DjangoでREST APIを作成するには、Django REST frameworkが便利です。

$ sudo python -m pip install djangorestframework
新しいプロジェクトとアプリケーションを作成します。
$ django-admin startproject tutorial .
$ cd tutorial
$ django-admin startapp quickstart
$ cd ..
データベースと同期します。
$ python manage.py migrate

【参考】「はじめての Django アプリ作成、その2

API認証用のユーザを作成します。

$ python manage.py createsuperuser --email admin@example.com --username admin
Password: 
Password (again): 
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.
tutorial/quickstart/serializers.pyを作成し、中身を以下のようにしてシリアライザを作成します。
from django.contrib.auth.models import Group, User
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']
tutorial/quickstart/views.pyを開き、中身を以下のようにしてViewを定義します。
from django.contrib.auth.models import Group, User
from rest_framework import permissions, viewsets

from tutorial.quickstart.serializers import GroupSerializer, UserSerializer


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]
tutorial/urls.pyを開き、中身を以下のようにしてルーティングを定義します。
from django.urls import include, path
from rest_framework import routers

from tutorial.quickstart import views

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

# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
    path('', include(router.urls)),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

urlpatterns += router.urls
tutorial/settings.pyINSTALLED_APPSフィールドに以下の文を追加し、Django REST Frameworkを使えるようにします。
INSTALLED_APPS = [
    ...
    'rest_framework',
]

これで準備完了です。早速試してみましょう。まずはサーバを起動します。

$ python manage.py runserver
curlでAPIを実行します。先ほど指定したadminユーザのパスワードを入力すると、値が返却されます。
$ curl -u admin -H 'Accept: application/json; indent=4' http://127.0.0.1:8000/users/
Enter host password for user 'admin':
[
    {
        "url": "http://127.0.0.1:8000/users/1/",
        "username": "admin",
        "email": "admin@example.com",
        "groups": []
    }
]

Web UIによるAPIのテストも可能です。画面右上より、adminユーザでログインしてください。

日本オラクル株式会社

Oracle Groundbreaker Advocate
Solution Atchitect

ERPパッケージベンダーに新卒で入社後、レガシーなアプリをいかに改善していくかという業務に従事。主に機能開発やパフォーマンス改善、フロントエンド基盤のリプレイスを担当。日本オラクルに入社後は、アプリ開発者としての経験を活かし、WebLogicやCloud Native領域を担当。

Community:
Oracle Cloud Hangout Cafe メンバー(#ochacafe)

連載バックナンバー

仮想化/コンテナ技術解説
第6回

Oracle Cloud Hangout Cafe Season 4 #5「Kubernetesのオートスケーリング」(2021年8月4日開催)

2024/5/29
第2弾の連載第6回では、2021年8月4日に開催された「Oracle Cloud Hangout Cafe Season4 #5『Kubernetesのオートスケーリング』」の発表内容に基づいて紹介していきます。
仮想化/コンテナ技術解説
第5回

Oracle Cloud Hangout Cafe Season4 #4「Observability 再入門」(2021年9月8日開催)

2024/4/23
第2弾の連載第5回では、2021年9月8日に開催された「Oracle Cloud Hangout Cafe Season4 #4『Observability 再入門』」の発表内容に基づいて紹介していきます。
仮想化/コンテナ技術解説
第4回

Oracle Cloud Hangout Cafe Season6 #4「Pythonで作るAPIサーバー」(2022年12月7日開催)

2024/3/21
第2弾の連載第4回では、2022年12月7日に開催された 「Oracle Cloud Hangout Cafe Season6 #4『Pythonで作るAPIサーバー』」の発表内容に基づいて紹介していきます。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています