6
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

REST APIをFastAPIで実装しデプロイ

Last updated at Posted at 2023-09-03

はじめに

以下の3つのいずれかに当てはまる方を対象として書いています。

  1. REST APIについて知らない
  2. FastAPIを触ったことがない
  3. FastAPIで作ったものを公開したい

ゴール

本記事のゴールは「はじめに」で説明した3点について理解することです。
以下のURLはFastAPIで作った掛け算をするAPIになります。
下記URLにアクセスすると、作成したAPIをテストすることができます。
TryItというボタンを押した後にリクエストの数値を変えて送ると、計算した結果が返ってきます。

APIとは

"Application Programming Interface"の略
APIは何かしらのリクエストに対して、レスポンスを返すものです。
GoogleMapAPIでは、位置情報(緯度、経度)を渡すと、その周辺の位置情報を返してくれます。
ホットペッパーグルメのAPIでは、位置情報を渡すと、その周辺のお店の情報を返してくれます。

APIっていうのは主にクライアント(ブラウザ)とバックエンド(サーバ)との通信に用いられます。その『通信』にはいろんなルールがあって、それぞれにメリットデメリットがあります。

  • REST API
  • GraphQL
  • gRPC

REST APIとは

"Representational State Transfer"
以下の4つの基本原則を満たしたものをREST,RESTfulと言います。設計思想の1つだと思ってください。

  1. 統一インターフェース
  2. アドレス可能性
  3. 接続性
  4. ステートレス性
統一インターフェースっていうのは、次章でまとめたHTTPっていうやり方で通信をする。 通信するデータはJSON形式にする。っていうのがRESTAPIの基本です。

REST apiについては以下サイトを参考にしました。

HTTPメソッド

webアプリの基本は、データに対してCRUDと呼ばれる4つの操作を行うことになります。
そのCRUD操作は、予め決められたHTTPっていう通信方法で行います。その方法のことをメソッドと言います。代表的なHTTPメソッドは以下です。

  1. GET (Read:データ取得)
  2. POST (Create:データ登録,更新)
  3. PUT (Update:データの変更)
  4. DELETE (Delete:データの削除)

FAST APIとは

  • バックエンドAPIを作成するためのpythonのフレームワーク
    pythonだと他にFlaskやDjangoRestFrameworkがあります。
  • 高速に作れて、高速に動作する
  • pydanticと組み合わせることで、バリデーションチェックを行ってくれる
  • 自動でAPIドキュメントを生成し、手動テストすることができる
  • ORM(データベースを操作するのを簡単にするツール)であるSQLAlchemyを用いることができる
a: int
a = 3
s: str
s = "string"

上記のように型ヒントを用いることで、入力した値が型に一致するか判定できます。
例えばフロントエンドからバックエンドへデータを送る際のリクエストの型があっているか判定できます。

main.py
from pydantic import BaseModel

class UserCreate(BaseModel):
    name: str
    age: int

上記のコードは、スキーマ定義といって、BaseModelを継承することで、自分で型を定義できます。

main.py
@app.get("/user/")
def create_user(user: UserCreate)
#引数のuserが、UserCreateクラスのデータ型になるように縛っている
    new_user = ...
    return new_user

FAST APIの環境構築

python3.6以上が必要になります。

python --version

python3.6以上が入っていることを確認したら、以下の2つのライブラリをインストールします。
今回は fastapi-test/ というディレクトリで進めます。

fastapi-test/
pip install fastapi
pip install uvicorn

FastAPIを起動

ライブラリのインストールが終わったら、main.pyというファイルを作成します。main.pyに以下を記述していきます。

python fastapi-test/main.py
from fastapi import FastAPI #FastAPIをインポート

app = FastAPI() #FastAPIのインスタンス作成

@app.get("/") #getメソッドで"/"にアクセス
def hello():
    return {"message":"Hello World!"}

上記を書き終えたら保存し、powershell等で以下のコマンドを使ってサーバを起動させましょう。

fastapi-test/
uvicorn main:app --reload

「--reload」をつけて置くことでmain.pyを書き換えた後自動でサーバを再起動してくれます。
ご自身のブラウザで「localhost:8000」と打ってアクセスしてみましょう。
「{"message":"Hello World!"}」と出力されたら成功です!

FastAPIで簡単な機能実装

次はPOSTメソッドで数値を送り、その数値を掛け算して結果を返すAPI機能を作ってみます。

fastapi-test/main.py
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

@app.get("/")
def hello():
    return {"message":"Hello World!"}

@app.post("/")
def calc(x: int,y: int):
    z = x*y
    return {"result":z}

上記を記述できたら、localhost:8000に飛んでみましょう。
localhost:8000/docsと打つと、作成したAPIのドキュメントが自動で作られています。
POST / Calc という部分をクリックすると、「Try it out」というボタンがあるので押しましょう。
その後自分で作ったx,yという変数に数値を入力しExecuteを押すとリクエストをテスト送信できます。
下の方にいくとレスポンス結果が見れます。
「Code」の下にある数値が200になっていれば成功です。Response bodyに{"result":45}などの数値でx*yの結果が返ってきていれば成功です。

APIを公開

Deta Spaceというサービスは変化が激しいようです。2023年9月時点で作成していたDeta Spaceのアカウントでは下記の手法で問題なくデプロイができましたが、現在はDeveloper Modeの申請が必要になっているようです。
すぐにデプロイしたい方にはHeroku,Renderといったサービスをお勧めします。

Deta Spaceにデプロイ

Deta Spaceというサービスでアカウントを作成し、ログインします。
めちゃくちゃわかりやすいサイトがありましたので、参考にしてください。

main.pyと同階層に以下を記述したテキストファイルを入れておいてください。アップロードするサーバがこのテキストを読んでFastAPIをインストールして動ける状態にしてくれます。

fastapi-test/requirements.txt
fastapi

Deta Spaceにログインできたら、後は2つのコマンドを実行するだけです。

fastapi-test
space new

spacefileというファイルが作成されるので、一番下に 「public: true」 と入れておいてください

fastapi-test/Spacefile
# Spacefile Docs: https://go.deta.dev/docs/spacefile/v0
v: 0
micros:
  - name: deploy-api
    src: ./
    engine: python3.9
    primary: true
    public: true

下記コマンドでサーバにデプロイできます。
成功するとURLが表示されるので、URLをクリックすると作成したAPIにアクセスできます。
今後ソースコードを変更した際も、下記コマンド1発でサーバに変更を反映させることができます。

fastapi-test
space push

参考記事・書籍

  • FastAPI入門
    FastAPIをもっと詳しく知りたい方、Dockerを使って開発したい方、非同期処理をしてみたい方にお勧め

  • 『WEBを支える技術』山本陽平.技術評論社.2010
    RESTについて知りたい方、WEBの基礎について知りたい方にお勧め

  • 『基礎から学ぶFastAPI実践入門』久保田公平.2021
    本記事よりも詳しく、そしてわかりやすくFastAPIについて書かれてあり、手元で動かしながら学習できる書籍です。

  • FastAPI公式ドキュメント

  • SQLAlchemy公式ドキュメント

最後に

読んでくださりありがとうございました。
急ピッチで書いたので、至らぬ点が多いと思いますがご了承いただければ幸いです。
適宜加筆・修正も行って参りますので何かご要望・ご質問等ありましたらコメントをお願いします。

6
8
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?