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でAPIサーバーを作ってみよう

データベースと接続して、APIを実装する準備を整えましょう。ここでは、Oracle Database前提で、特にOCI上のAutonomous Databaseを利用して解説します。

python-oracledbとcx_Oracle

python-oracledbとcx_OracleはどちらもPythonでOracle Databaseを使用するためのドライバです。元々Python用のドライバとしてはcx_Oracleがありましたが、名前が変わり、今後はpython-oracledbの利用が推奨となっています。

python-oracledbは、以下のコマンドでインストールできます。

$ python -m pip install oracledb

各フレームワークでデータベースと接続

それでは、Django、Flask、FastAPIの各フレームワークでAutonomous Databaseに接続してみます。

・Django
元々Djangoはpython-oracledbをネイティブ・サポートしていませんでしたが、2023年12月リリースのv5.0からサポートされ、cx_Oracleはdeprecatedとなりました。しかしDjango5.0はLTSではないので、ここでは従来通りのcx_Oracleを利用した方法を解説します。

  1. Oracle Client
  2. をダウンロードしてインストール
  3. cx_Oracleをインストール
    • $ pip install cx_oracle
  4. Autonomous DatabaseのWalletをダウンロード、展開して中身のcwallet.ssosqlnet.ora、tnsnames.ora/usr/lib/oracle/<version>/client64/lib/network/adminに配置
  5. 環境変数としてTNS_ADMINにWalletの配置先を設定
    • TNS_ADMIN=<Walletの配置先>
  6. 環境変数としてLD_LIBRARY_PATHにOracle Clientのインストール先を指定
    • LD_LIBRARY_PATH=<Oracle Clientの配置先>

settings.pyを変更します。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.oracle',
        'NAME': '<TNS名>',
        'USER': '<データベースのユーザ名>',
        'PASSWORD': '<データベースユーザのパスワード>',
    }
}
Djangoを実行します。Djangoのデフォルト画面が出れば接続成功です。
$ python manage.py runserver
何かエラーが発生した場合は、データベースと同期することでうまくいく場合が多いので、以下のコマンドをお試しください。
$ python manage.py migrate

・Flask
FastAPIもデータベースとの接続部分をフレームワークとしては持たないため、単純にpython-oracledbをインストールするだけで接続できます。また、Autonomous DatabaseとはWalletを利用して接続できます。

import oracledb

pool = oracledb.create_pool(
        user="<データベースのユーザ名>",
        password="<データベースユーザのパスワード>",
        dsn="<TNS名>",
        config_dir="<Walletの配置先>", 
        wallet_location="<Walletの配置先>",
        wallet_password="<Walletのパスワード>"
)

@app.route('/getTime', methods=['GET'])
def get_time_db():
  with pool.acquire() as connection:
    cursor = connection.cursor()
    sql = """select sysdate from dual""" 
    for res in cursor.execute(sql):
      result = str(res)
  return result

・FastAPI
FastAPIもデータベースとの接続部分をフレームワークとしては持たないため、単純にpython-oracledbをインストールするだけで接続が可能です。以下は、Walletを利用してAutonomous Databaseと接続する場合の例です。

import oracledb

pool = oracledb.create_pool(
        user="Glt;データベースのユーザ名>",
        password="<データベースユーザのパスワード>",
        dsn="<TNS名>",
        config_dir="<Walletの配置先>", 
        wallet_location="<Walletの配置先>",
        wallet_password="<Walletのパスワード>"
)

@app.get('/getTime')
def get_time_db():
  with pool.acquire() as connection:
    cursor = connection.cursor()
    sql = """select sysdate from dual""" 
    for res in cursor.execute(sql):
      result = str(res)
  return result

各フレームワークでコンテナ化

ここからは、各フレームワークでコンテナ化する手順を解説します。

・Django
Djangoアプリケーションをコンテナ化するには、Dockerfilerequirements.txtの2つのファイルが必要です。2つのファイルを用意して、docker image build -t ~~を実行することでコンテナイメージを作成できます。

Dockerfileの中身は、以下のようになります。

FROM python:3.6-slim-buster
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt 
ADD . /code/
CMD python3 manage.py runserver

requirements.txtの中身には、Djangoプロジェクト実装時にインストールが必要なパッケージをリストします。例えばDjango REST Frameworkを利用する場合は、以下の通りです。

djangorestframework

・Flask
FlaskもDjangoと同様にDockerfilerequirements.txtの2つのファイルが必要です。2つのファイルを用意して、docker image build -t ~~を実行することでコンテナイメージを作成できます。

FROM python:3.6-slim-buster
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt 
ADD . /code/
ENV FLASK_APP hello.py #Flaskの場合はENVの設定が必要
CMD ["flask", "run"]

・FastAPI
Python3.7以降を使うと、非常に簡単にコンテナ化できます。

FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7
COPY hello.py
CMD ["uvicorn", "hello:app"]

gRPC with Python

ここまでREST APIについて解説してきましたが、最後にgRPCを利用したPythonのAPIサーバについても少し触れておきます。

gRPCは、スキーマ駆動の開発、HTTP/2による高速通信、複数のストリーミング通信などを実現できる将来性のあるRPCフレームワークです。

・gRPCのコンポーネント
gRPCには、コンポーネントとしてServerとClientがあります。

  • Server
    • リクエストを受け、レスポンスを返却するサービス層
  • Client
    • リクエストを送信し、レスポンスを受け取る
    • 内部的にServerのStubを保持し、リクエスト送信の実装は、このStubのメソッドを実行する

・Protocol Buffers
gRPCは、一般的にデータをシリアライズする方式としてProtocol Buffers(Protobuf)を使用します。ProtobufはGoogleが開発(2008年にオープンソース化)したシリアライズフォーマットです。

  • IDL(インターフェース記述言語)を用いて、任意言語のボイラープレートコードを生成
  • リクエスト/レスポンスのスキーマを最初に定義する開発スタイル
  • 多言語に対応しており、異言語間のやり取りが発生しうるMicroservicesアプリとの相性が良い
  • 型安全なスキーマ

・Quick start
gRPCをインストールします。

$ python -m pip install grpcio
gRPC toolをインストールします。
$ python -m pip install grpcio-tools
gRPC公式のサンプルを使用します。
# Clone the repository to get the example code:
$ git clone -b v1.61.0 --depth 1 --shallow-submodules https://github.com/grpc/grpc
# Navigate to the "hello, world" Python example:
$ cd grpc/examples/python/helloworld
examples/python/helloworldディレクトリでgRPCサーバーを実行します。
$ python greeter_server.py
環境によっては「builder.pyが存在しない」といったエラーが出るので、その場合はprotobufをアップデートします。
$ python -m pip install protobuf==<バージョン>
別ターミナルを開き、gRPCクライアントを実行します。
$ python greeter_client.py
Will try to greet world ...
Greeter client received: Hello, you!

おわりに

今回は、PythonでAPIサーバを構築するにあたっての基礎的な部分を解説しました。それぞれのフレームワークにはそれぞれ良いところがあります。

  • Django
    • フレームワークとしての決まりごとがしっかりしている
    • 歴史が古い
    • 大規模なアプリケーション向き
  • Flask
    • 軽量
    • 拡張性が高い
    • 小規模なアプリケーション(or Microservices)向き
  • FastAPI
    • 最軽量
    • 拡張性が高い
    • 小規模なアプリケーション(or Microservices)向き

この記事をきっかけに、PythonによるAPIサーバの実装そのものに興味を持っていただく、または、実際にフレームワークを選択する際の参考にしていただければ幸いです。

日本オラクル株式会社

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メルマガ会員のサービス内容を見る

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