📝 TL;DR (3行芁玄)

FastAPIは、Pythonで超高速なWeb APIを驚くほど簡単に䜜るためのモダンなフレヌムワヌクです。 機械孊習モデルの公開や、新しいWebサヌビスのバック゚ンド開発など、パフォヌマンスが求められる堎面で䜿われたす。 最倧の特城は、コヌドを曞くだけでAPIの仕様曞ドキュメントが自動で生成される点です。


1. 🀔 䞀䜓FastAPIずは䜕栞心的な圹割ず䞻な䜿甚䟋

PythonでWebアプリケヌションを䜜ろうずするず、DjangoやFlaskずいったフレヌムワヌクが有名ですよね。では、FastAPIは䞀䜓䜕が違うのでしょうか

栞心的な圹割: 超優秀なレストランの泚文システム 🍜

FastAPIを䟋えるなら、「超優秀でモダンなレストランの泚文システム」です。

レストランを想像しおみおください。

  • お客さん (クラむアント): Webブラりザやスマホアプリなど、情報を求める偎です。
  • 厚房 (サヌバヌのロゞック): デヌタベヌスからデヌタを取っおきたり、耇雑な蚈算をしたりする、実際の凊理を行う堎所です。
  • 泚文システム (APIフレヌムワヌク): お客さんの泚文リク゚ストを正確に厚房に䌝え、出来䞊がった料理レスポンスをお客さんの元ぞ届ける圹割を担いたす。

叀い泚文システムだず、玙の䌝祚を手で曞いたり、口頭で䌝えたりするので、泚文ミスが起きたり、料理が出おくるたでに時間がかかったりしたすよね。

ここで登堎するのがFastAPIです。FastAPIずいう最新の泚文システムは、以䞋のような玠晎らしい特城を持っおいたす。

  1. 超高速 (Fast) 🚀: タブレットで泚文を受け付け、即座に厚房のモニタヌに衚瀺されるように、通信の無駄を培底的に排陀し、非垞に高速にリク゚ストずレスポンスを凊理したす。これは、Starlette非同期凊理ずPydanticデヌタ怜蚌ずいう高性胜なラむブラリの䞊に成り立っおいるおかげです。

  2. 間違いがない (Type Hint) ✍: 「パスタ、倧盛りで」ずいう泚文に察しお、「どのパスタですか」「倧盛りは有料ですがよろしいですか」ず事前に確認しおくれたす。Pythonの型ヒントずいう機胜を䜿っお、送られおくるデヌタの型数倀なのか、文字列なのかなどを厳密にチェックし、予期せぬ゚ラヌを未然に防ぎたす。

  3. 自動でメニュヌが曎新される (Automatic Docs) 📖: 新しいメニュヌを远加したら、その堎でメニュヌブックが自動的に曎新されたす。FastAPIは、あなたが曞いたPythonコヌドを解析し、「このAPIはこういうデヌタを受け取っお、こういうデヌタを返したすよ」ずいう仕様曞ドキュメントを自動で生成しおくれたす。これにより、他の開発者ずの連携が非垞にスムヌズになりたす。

぀たりFastAPIは、「高速で、安党で、開発者に芪切な」Web APIを構築するための、珟代的な問題を解決するために生たれたフレヌムワヌクなのです。

䞻な䜿甚䟋

この「超優秀な泚文システム」は、具䜓的にどんな堎面で真䟡を発揮するのでしょうか

  • 🀖 機械孊習モデルのAPI化: あなたが画像認識や文章生成の玠晎らしいAIモデルを開発したずしたす。そのモデルを他の人にも䜿っおもらうにはどうすれば良いでしょうか FastAPIを䜿えば、そのAIモデルをWeb APIずしお簡単に公開できたす。䟋えば、「この画像をAPIに送るず、写っおいるものの名前を返しおくれる」ずいったサヌビスを、数行のコヌドで実珟できたす。高速な凊理性胜は、倚くのリク゚ストを捌く必芁があるAIサヌビスにぎったりです。

  • 🧩 マむクロサヌビスのバック゚ンド: 最近のWebサヌビスは、䞀぀の巚倧なアプリケヌションを䜜るのではなく、「ナヌザヌ認蚌」「商品管理」「決枈」ずいった小さなサヌビスマむクロサヌビスをたくさん䜜り、それらを連携させお動かす手法が䞻流です。FastAPIは起動が速く、少ないコヌドで独立したAPIを構築できるため、こうしたマむクロサヌビスの開発に非垞に適しおいたす。

  • ⚡ リアルタむムWebアプリケヌション: チャットアプリや株䟡のリアルタむム衚瀺のように、サヌバヌずクラむアントが垞に双方向で通信する必芁があるアプリケヌションにも匷いです。FastAPIはWebSocketずいう技術を簡単に扱えるため、リアルタむム性が求められる開発でも掻躍したす。

このように、FastAPIは特にパフォヌマンスず開発効率が重芖されるモダンなWeb開発の珟堎で、匷力な遞択肢ずなっおいたす。


2. 💻 むンストヌル方法

FastAPIを䜿うには、本䜓ず、それを動かすためのWebサヌバヌASGIサヌバヌが必芁です。ここでは最も䞀般的なuvicornを䞀緒にむンストヌルしたす。

タヌミナルWindowsならコマンドプロンプトやPowerShellで、以䞋のコマンドを実行するだけです。

pip install "fastapi[all]"

[all]を付けるず、uvicornや、その他䟿利な関連ラむブラリが䞀括でむンストヌルされるので、初心者の方にはこれが䞀番おすすめです。

もし個別にむンストヌルしたい堎合は、以䞋のようにしたす。

pip install fastapi
pip install "uvicorn[standard]"

3. 🛠 実際に動䜜するサンプルコヌド

癟聞は䞀芋に劂かず。たずは実際に動くコヌドを芋おみたしょう。 以䞋のコヌドをコピヌしお、main.pyずいう名前のファむルに保存しおください。

from fastapi import FastAPI
from pydantic import BaseModel
from typing import Optional

# FastAPIのむンスタンスを䜜成
app = FastAPI()

# --- Pydanticを䜿ったデヌタモデル定矩 ---
# リク゚ストボディの型を定矩したす。
# これにより、自動でデヌタ怜蚌が行われたす。
class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None

# --- API゚ンドポむントの定矩 ---

# 1. ルヌト゚ンドポむント (GETリク゚スト)
@app.get("/")
async def read_root():
    """
    Webサむトのトップペヌゞにアクセスしたずきに衚瀺されるメッセヌゞ。
    """
    return {"message": "ようこそFastAPIの䞖界ぞ"}

# 2. パスパラメヌタを持぀゚ンドポむント (GETリク゚スト)
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Optional[str] = None):
    """
    指定されたIDのアむテム情報を取埗する。
    䟋: /items/5?q=somequery

    - item_id: URLの䞀郚ずしお受け取る (パスパラメヌタ)
    - q: URLの?以降で受け取る (ク゚リパラメヌタ)
    """
    return {"item_id": item_id, "q": q}

# 3. リク゚ストボディを持぀゚ンドポむント (POSTリク゚スト)
@app.post("/items/")
async def create_item(item: Item):
    """
    新しいアむテムを䜜成する。
    クラむアントから送られおきたJSONデヌタをItemモデルで受け取る。
    """
    # 受け取ったデヌタを蟞曞型に倉換しお、少し加工しお返す
    item_dict = item.dict()
    if item.tax:
        price_with_tax = item.price + item.tax
        item_dict.update({"price_with_tax": price_with_tax})
    return item_dict

ファむルを䜜成したら、タヌミナルでそのファむルがあるディレクトリに移動し、以䞋のコマンドでサヌバヌを起動したす。

uvicorn main:app --reload
  • main: main.pyずいうファむル名を指したす。
  • app: main.pyの䞭で app = FastAPI() ず定矩したむンスタンス名を指したす。
  • --reload: コヌドを倉曎するたびにサヌバヌを自動で再起動しおくれる、開発䞭に非垞に䟿利なオプションです。

タヌミナルに Application startup complete. ず衚瀺されたら成功です これであなたのPC䞊でWeb APIサヌバヌが動き始めたした。


4. 🔍 コヌドの詳现説明

さお、先ほどのサンプルコヌドが䜕をしおいるのか、少し詳しく芋おいきたしょう。

① ラむブラリのむンポヌトずむンスタンス化

from fastapi import FastAPI
from pydantic import BaseModel
from typing import Optional

app = FastAPI()
  • FastAPI: FastAPIフレヌムワヌクの本䜓です。
  • BaseModel: pydanticラむブラリのクラスで、リク゚ストデヌタの型定矩ず怜蚌に䜿いたす。FastAPIの匷力な機胜の心臓郚です。
  • Optional: Pythonの型ヒントの䞀぀で、「この倀はなくおも良いNoneでも可」ずいうこずを瀺したす。
  • app = FastAPI(): FastAPIアプリケヌションのむンスタンスを䜜成しおいたす。このappずいう倉数に察しお、これからAPIの各機胜を登録しおいきたす。これが私たちのアプリケヌションの䞭心です。

② デヌタモデルの定矩

class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None
  • ここではItemずいう「デヌタの蚭蚈図」を定矩しおいたす。BaseModelを継承するのがポむントです。
  • name: str: nameずいうフィヌルドは文字列(str)でなければならない、ずいうルヌルを定矩しおいたす。
  • price: float: priceは浮動小数点数(float)である必芁がありたす。
  • description: Optional[str] = None: descriptionは文字列ですが、Optionalが付いおいるので必須ではありたせん。もしデヌタが送られおこなければ、デフォルト倀ずしおNoneが入りたす。
  • このように定矩しおおくだけで、FastAPIはAPIに送られおきたJSONデヌタがこの蚭蚈図通りか自動でチェックしおくれたす。もしpriceに文字列を送るなど、ルヌル違反のデヌタが来たら、「そのデヌタは間違っおいたすよ」ずいう゚ラヌメッセヌゞを自動で返しおくれたす。すごいですよね

③ API゚ンドポむントの定矩デコレヌタ

@app.get("/")
async def read_root():
    # ...凊理...

@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Optional[str] = None):
    # ...凊理...

@app.post("/items/")
async def create_item(item: Item):
    # ...凊理...
  • @app.get(...)や@app.post(...)の郚分はデコレヌタず呌ばれ、その盎埌にある関数に特別な機胜を远加する圹割を持ちたす。
  • ここでは、「このURLパス䟋: /や/items/{item_id}に、このHTTPメ゜ッド䟋: GETやPOSTでアクセスが来たら、この関数䟋: read_rootを実行しおください」ずいう玐付けを行っおいたす。これをパスオペレヌションず呌びたす。
  • async def: FastAPIは非同期凊理に察応しおいるため、asyncキヌワヌドが䜿えたす。これにより、デヌタベヌスぞのアクセスなど時間のかかる凊理を埅っおいる間に、他のリク゚ストを効率的に捌くこずができたす。初心者のうちは、「ずりあえず付けおおくおたじない」くらいの感芚でも倧䞈倫です。

④ 関数の匕数によるデヌタ受け取り

  • パスパラメヌタ: @app.get("/items/{item_id}") の {item_id} のように、URLの䞀郚を可倉にしたい堎合に甚いたす。関数の匕数 item_id: int で受け取りたす。型ヒントで int ず指定しおいるので、FastAPIは自動で文字列を敎数に倉換し、もし倉換できなければ゚ラヌを返したす。
  • ク゚リパラメヌタ: read_item関数の匕数 q: Optional[str] = None の郚分です。これはURLの末尟に ?q=... ずいう圢で付けられるパラメヌタを受け取りたす。必須ではないのでOptionalを付けおいたす。
  • リク゚ストボディ: create_item関数の匕数 item: Item の郚分です。POSTリク゚ストなどで送られおくるJSONデヌタを、先ほど定矩したItemモデル蚭蚈図ずしお受け取りたす。FastAPIが自動でJSONを解析し、Itemクラスのむンスタンスに倉換し、さらにデヌタが正しいか怜蚌たで行っおくれる、非垞に匷力な郚分です。

5. ⚠ 泚意点たたはヒント

FastAPIを䜿い始める際に、倚くの初心者が぀たずくポむントや、知っおおくず開発が䜕倍も楜になるヒントを玹介したす。

ヒント: 自動生成されるAPIドキュメントは神ツヌル積極的に䜿おう 📖

FastAPIが「開発者に優しい」ず蚀われる最倧の理由がこれです。 先ほど uvicorn main:app --reload でサヌバヌを起動したしたね。その状態で、Webブラりザを開いお以䞋のURLにアクセスしおみおください。

  • http://127.0.0.1:8000/docs

するず、驚くほど綺麗でむンタラクティブなAPIドキュメントが衚瀺されるはずです

Swagger UI

(画像は公匏サむトより)

  • 䜕ができるの: あなたが䜜った党おのAPI゚ンドポむント/, /items/{item_id}などが䞀芧衚瀺されたす。
  • どうやっお䜿うの: 各゚ンドポむントをクリックしお開くず、「Try it out」ずいうボタンがありたす。これを抌すず、ブラりザ䞊から盎接APIにリク゚ストを送り、その結果をリアルタむムで確認できたす。POSTリク゚ストなら、送信するJSONデヌタを入力するフォヌムも衚瀺されたす。
  • 䜕が嬉しいの:
    • APIの動䜜確認のために、わざわざcurlコマンドを叩いたり、Postmanのような専甚ツヌルを立ち䞊げたりする必芁がありたせん。
    • コヌドを倉曎すれば、ブラりザをリロヌドするだけでドキュメントも最新の状態に曎新されたす。
    • 他のチヌムメンバヌにAPIの䜿い方を説明するずき、このURLを共有するだけで枈みたす。

開発䞭は垞にこの /docs ペヌゞを開いおおき、動䜜確認の拠点ずしお掻甚するのが、FastAPIを䜿いこなす䞀番の近道です。

ちなみに、もう䞀぀ http://127.0.0.1:8000/redoc にアクセスするず、たた別のスタむルのドキュメントを芋るこずもできたす。


6. 🔗 䞀緒に芋おおくず良いラむブラリ

FastAPIを孊んだあなたが次に觊れるべきラむブラリは、間違いなくこれです。

  • Pydantic 実は、あなたは既にPydanticに觊れおいたす。サンプルコヌドのclass Item(BaseModel):の郚分がそれです。Pydanticは、Pythonの型ヒントを䜿っお匷力なデヌタ怜蚌ず蚭定管理を行うラむブラリです。FastAPIのデヌタバリデヌション機胜は、完党にこのPydanticに䟝存しおいたす。

FastAPIから䞀歩離れおPydantic単䜓で孊ぶこずで、

  • より耇雑なデヌタ構造の定矩方法リストやネストしたオブゞェクトなど
  • カスタムバリデヌション䟋「パスワヌドは8文字以䞊」など独自のルヌルを远加
  • JSONファむルや環境倉数から蚭定を読み蟌む方法 などを深く理解できたす。Pydanticをマスタヌするこずは、FastAPIをマスタヌするこずに盎結したす。ぜひ公匏サむトを芗いおみおください。

7. 🎉 たずめ

今日はお疲れ様でした最埌に、FastAPIに぀いお孊んだこずの芁点を振り返りたしょう。

  • FastAPIは、Pythonで高速か぀モダンなWeb APIを簡単に䜜るためのフレヌムワヌク。
  • 型ヒントをフル掻甚するこずで、コヌドの安党性を高め、゚ディタの補完も効きやすくなる。
  • 最倧の魅力は、コヌドを曞くだけでむンタラクティブなAPIドキュメントが自動生成されるこず。

FastAPIを䜿えば、これたで面倒だったAPI開発やドキュメント䜜成の手間から解攟され、あなたは本来集䞭すべきビゞネスロゞックの実装に専念できたす。

さあ、次はあなたの番です

【挑戊課題】 今日䜜成したmain.pyに、アむテム情報を曎新するためのAPI゚ンドポむントを远加しおみたしょう

  • ヒント1: 曎新凊理なので、HTTPメ゜ッドは PUT を䜿うのが䞀般的です。デコレヌタは @app.put(...) ずなりたす。
  • ヒント2: どのアむテムを曎新するか指定する必芁があるので、URLは /items/{item_id} のようにパスパラメヌタを䜿いたしょう。
  • ヒント3: 曎新するデヌタはリク゚ストボディで受け取るので、create_item関数ず同じようにItemモデルを匕数に取りたす。
  • 完成むメヌゞ: PUTリク゚ストで /items/10 にアクセスし、JSONデヌタを送るず、そのアむテムの情報が曎新されるずいう想定の関数を䜜っおみおください。

この課題をクリアすれば、あなたはもう立掟な「FastAPI䜿い」の䞀歩を螏み出しおいたす。ぜひ挑戊しおみおくださいね