Python FAST API Deta cloudを使って簡単にWeb APIを公開する

Python

今回は、Deta cloudというサービスについて触れていきます。

またDeta cloudを使って、簡単にWeb APIを公開する方法を紹介致します。

1.FAST APIとは

まずDeta cloudを利用するにあたり、FAST APIを利用します。

Pythonの標準である型ヒント(type hint)に基づいてPython3.6以降でAPIを構築するための、モダンで、高速(パフォーマンス)なWebフレームワークです。

※高度な技術者向けよりかは、API開発初学者向けの特徴です。

FAST API主な特徴

  • 直観的でわかりやすい書き方
  • 公式ドキュメントの情報が豊富
  • 自動ドキュメント生成機能がすごい(Swagger UIと連携)
  • バリデーション機能の実装が簡単(type hintが肝心)

公式ドキュメント

2.Deta cloudとは

代表的なクラウドサービスには、AWS、 Azure、 GCPがあるが、それよりももっと簡単にホスティングできるサービスです。

またAWS,Azure,GCPは無料利用枠があるものの、期間や一定使用量を超えたら、それ以降は従量課金となるが、Deta cloudは無料で利用することが可能である。(アカウント作成時クレカ登録不要)

FAST APIが推奨しているDeta Cloudにデプロイしてみます。

公式サイト

Deta にアカウントを作成

Deta-cloud

「Join Deta」からアカウントを作成していきます。

Deta-signup

username、 password、 emailを適宜入力して「Sign Up」へ進みます。

verify-Deta at email

無事アカウント作成できるとメールが受信されます。

受信Boxにない場合は、迷惑メールに入っていないか確認するとよいかと思います。

※Slackへの招待もメールで来ますが、SlackはDetaのcommunity channelなので、Slackへ入っても、アカウントが認証されないので、注意が必要です。

Deta-welcome

メール内のリンクから、Deta のdefaultページが表示されれば、OKです。

3.サンプルAPIを用意する

必要なファイルの用意をします。

requirements.txt

fastapi


main.py

from fastapi import FastAPI
from fastapi.responses import JSONResponse
from pydantic import BaseModel
from deta import Deta
import json

# "project key" is necessary in local, but it's not on Deta base
deta = Deta()
users = deta.Base("fastapi-crud")

app = FastAPI()

class User(BaseModel):
  name: str
  age: int
  hometown: str

class UserUpdate(BaseModel):
  name: str = None
  age: int = None
  hometown: str = None

@app.get("/")
def index():
  return {"message": "hello world"}

@app.get("/users")
def read_user():
  return next(users.fetch())

@app.post("/users", status_code=200)
def create_user(user: User):
  user = users.put(user.dict())
  return json.dumps(user)

@app.get("/users/{uid}")
def read_user(uid: str):
  user = users.get(uid)
  if user:
    return user
  res = JSONResponse({"message": "user not found"}, status_code=404)
  return res

@app.patch("/users/{uid}")
def update_user(uid: str, uu:UserUpdate):
  update = {k:v for k,v in uu.dict().items() if v is not None}
  try:
    users.update(update, uid)
    return users.get(uid)
  except Exception:
    return JSONResponse({"message": "user not found"}, status_code=404)

@app.delete("/users/{uid}")
def delete_user(uid: str):
  users.delete(uid)
  return JSONResponse({"message": "user is deleted"}, status_code=200)

userテーブル(名前:fastapi-crud)を作って、CRUD用のmethodをそれぞれ用意しています。userを新規作成するpost methodでは、insertでもできるようですが、putの方が早いとドキュメントには記載があります。

Deta baseでは、新規データが作成されるとkey(ユニークなID)が自動採番されます。

patchにてuser情報をupdateする場合、uidをkeyとしてデータを更新するようにしています。

参考動画

ローカル環境でも、確認することは可能ですが、project key が必要です。

deta = Deta("project key")

 

簡易サーバーを立ち上げるコマンドは以下になります。

uvicorn deploy_api.main:app --reload

Deta にログインして、deployした確認がDeta cloud上でできるので、次に紹介する方法で、Deta cloudで見た方が早いかもしれません。

4.Deta cloudにサンプルAPIを公開する

Deta へデプロイしてWeb APIを公開するには、Deta CLIをインストールする必要があります。

Detaコマンドにて、Deta cloudへWeb APIをデプロイできます。

Deta CLIのインストール

Deta CLIのインストール

Deta-CLI-doc

MacとWindowsではコマンドが異なります。

Windows

iwr https://get.deta.dev/cli.ps1 -useb | iex

Mac/Linux

curl -fsSL https://get.deta.dev/cli.sh | sh

 

Deta-CLI-install

無事インストールできたら、detaコマンドを確認します。

deta help

Detaへlogin

deta login

deta-login

※VSCodeのターミナル上だとうまく行かなかったため、Windowsのpowershell上で実行してloginしてます。

デフォルトのブラウザが立ち上がり、Detaへのログインが求められます。

作成したアカウントでログイン後、ターミナル上の表示が「Logged in successfully」になります。

Deta への deploy

deta new

または

deta new --python

deta-new--python

※「deta new」でうまくいかない場合は、「deta new –python」でデプロイできるかと思います。

エンドポイントの確認

https://xxxxx.deta.dev/

※サブドメイン(xxxxx部分)があなたの専用のものになります

これで、Deta側へのデプロイができています。

すごく早くて簡単にできてしまうので、便利です!

deta-welcome-reload

ローカルで作成していたフォルダ名がDetaの画面上に表示されることが確認できます。

デプロイされたWeb APIの確認

生成されたエンドポイント(URL)にdocsまたはredocをつけると、自動生成されたドキュメントを見ることができます。

またAPIを試すことができます。

https://xxxxx.deta.dev/docs

正常にデプロイされると、以下のような感じで、定義されているmethodのドキュメントを見ることができます。

FAST-API-doc-swagger

POSTを選んでテストしてみます。

post-method-user-try-it-out

json形式で、適宜入力して、「Execute」で結果を確認します。

post-method-executed-200

200が返ってきて、bodyの結果もよさげです。

Deta 側でも確認できます。

deta-base-record

apiリクエストされると自動的に、テーブルおよびデータが作成されます。

docs側でリクエストしたデータが作成されていることがわかります。

その他のコマンド

コードを再度デプロイする場合

deta deploy

deta への変更を常に監視する場合
※ローカルで編集した内容が即時、Deta側へ反映されます

deta watch

5.まとめ

簡易的なWeb APIを作成して、動作確認をするのに向いています。

Databaseを利用する場合は、Deta BaseにてNoSQLでテーブル作成とCRUD操作はできるものの、複雑なクエリはまだ難しいのかと思います。

Driveには10GBまでファイルをアップロードできるので、画像など多く扱いたい場合に結構良さそうです。