Oracle Cloud Hangout Cafe Season6 #4「Pythonで作るAPIサーバー」(2022年12月7日開催)
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と非同期通信をサポート
$ 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つのプロジェクトに複数のアプリケーションを持つ構成です。
- プロジェクトでは、どのアプリケーションにルーティングするかを管理
- アプリケーションでは、どの関数にルーティングするかを管理
$ 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.py
のINSTALLED_APPS
フィールドに以下の文を追加し、Django REST Frameworkを使えるようにします。
INSTALLED_APPS = [ ... 'rest_framework', ]
これで準備完了です。早速試してみましょう。まずはサーバを起動します。
$ python manage.py runservercurlで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
ユーザでログインしてください。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- 「Python」+「PostgreSQL」のWebアプリ環境でデータの読み書きをしてみよう
- 「Dockerfile」を書いてコンテナを構築してみよう
- 「Pulumi Automation API」でPulumi CLIの機能をコード化しよう
- GitLabを用いた継続的インテグレーション
- Slackを独自アプリケーションで拡張する
- CloudサービスとRPAの連携
- VNC環境とRaspberry Piで簡単電子工作(7)
- TFXを使った機械学習パイプラインの構築(実装編その2)
- TFXを使った機械学習パイプラインの構築(デプロイ編)
- Policy as Codeでインフラのコンプライアンスを自動実現! 「Pulumi CrossGuard」を活用してみよう