はじめに
以下の3つのいずれかに当てはまる方を対象として書いています。
- REST APIについて知らない
- FastAPIを触ったことがない
- 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つだと思ってください。
- 統一インターフェース
- アドレス可能性
- 接続性
- ステートレス性
REST apiについては以下サイトを参考にしました。
HTTPメソッド
webアプリの基本は、データに対してCRUDと呼ばれる4つの操作を行うことになります。
そのCRUD操作は、予め決められたHTTPっていう通信方法で行います。その方法のことをメソッドと言います。代表的なHTTPメソッドは以下です。
- GET (Read:データ取得)
- POST (Create:データ登録,更新)
- PUT (Update:データの変更)
- DELETE (Delete:データの削除)
FAST APIとは
- バックエンドAPIを作成するためのpythonのフレームワーク
pythonだと他にFlaskやDjangoRestFrameworkがあります。 - 高速に作れて、高速に動作する
- pydanticと組み合わせることで、バリデーションチェックを行ってくれる
- 自動でAPIドキュメントを生成し、手動テストすることができる
- ORM(データベースを操作するのを簡単にするツール)であるSQLAlchemyを用いることができる
a: int
a = 3
s: str
s = "string"
上記のように型ヒントを用いることで、入力した値が型に一致するか判定できます。
例えばフロントエンドからバックエンドへデータを送る際のリクエストの型があっているか判定できます。
from pydantic import BaseModel
class UserCreate(BaseModel):
name: str
age: int
上記のコードは、スキーマ定義といって、BaseModelを継承することで、自分で型を定義できます。
@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/ というディレクトリで進めます。
pip install fastapi
pip install uvicorn
FastAPIを起動
ライブラリのインストールが終わったら、main.pyというファイルを作成します。main.pyに以下を記述していきます。
from fastapi import FastAPI #FastAPIをインポート
app = FastAPI() #FastAPIのインスタンス作成
@app.get("/") #getメソッドで"/"にアクセス
def hello():
return {"message":"Hello World!"}
上記を書き終えたら保存し、powershell等で以下のコマンドを使ってサーバを起動させましょう。
uvicorn main:app --reload
「--reload」をつけて置くことでmain.pyを書き換えた後自動でサーバを再起動してくれます。
ご自身のブラウザで「localhost:8000」と打ってアクセスしてみましょう。
「{"message":"Hello World!"}」と出力されたら成功です!
FastAPIで簡単な機能実装
次はPOSTメソッドで数値を送り、その数値を掛け算して結果を返すAPI機能を作ってみます。
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
Deta Spaceにログインできたら、後は2つのコマンドを実行するだけです。
space new
spacefileというファイルが作成されるので、一番下に 「public: true」 と入れておいてください
# 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発でサーバに変更を反映させることができます。
space push
参考記事・書籍
- FastAPI入門
FastAPIをもっと詳しく知りたい方、Dockerを使って開発したい方、非同期処理をしてみたい方にお勧め
-
『WEBを支える技術』山本陽平.技術評論社.2010
RESTについて知りたい方、WEBの基礎について知りたい方にお勧め -
『基礎から学ぶFastAPI実践入門』久保田公平.2021
本記事よりも詳しく、そしてわかりやすくFastAPIについて書かれてあり、手元で動かしながら学習できる書籍です。 -
FastAPI公式ドキュメント
- SQLAlchemy公式ドキュメント
最後に
読んでくださりありがとうございました。
急ピッチで書いたので、至らぬ点が多いと思いますがご了承いただければ幸いです。
適宜加筆・修正も行って参りますので何かご要望・ご質問等ありましたらコメントをお願いします。