FastAPI入門:初心者向けに基本から実践までわかりやすく解説

はじめに

プログラミングを始めたばかりの方にとって、Pythonはわかりやすい構文が魅力的だと思うかもしれません。 そのPythonを使って、Webアプリケーション開発を行う方法はいくつか存在します。 その中でもFastAPIは軽快な動作とシンプルな書き方で注目を集めています。 ここでは、初心者の皆さんが理解しやすいように、FastAPIの基本的な部分を一緒に確認していきましょう。 実際の利用シーンも交えながら、サーバーサイドの役割を体感できるように解説していきます。

この記事を読むとわかること

  • FastAPIとは何か
  • FastAPIを使って何ができるか
  • Webアプリケーションを作る手順と具体的なコード例
  • 実務で役立つ応用例の概要
  • 初心者がつまづきやすいポイント

FastAPIとは

FastAPIはPythonでWebアプリケーションやAPIを構築するためのフレームワークです。 非同期処理に対応していて、リクエストを効率よくさばけるのが特徴だといわれます。 また、自動的にAPIのドキュメントを生成する機能を持っているので、開発者同士の連携やテストで便利です。

一方、DjangoやFlaskなどのフレームワークと比べると、FastAPIはコード量をコンパクトに保ちやすいという意見があります。 初心者にも取り組みやすい構造でありながら、RESTful APIの設計を学ぶうえでも使いやすいのではないでしょうか。 Webアプリケーションだけでなく、マイクロサービスや小規模なAPI開発でも試しやすいのが魅力です。

FastAPIを使うメリット

FastAPIを使うメリットはいくつかあります。 まず、コードの読みやすさがあげられます。 Pythonらしいシンプルな文法とFastAPIのデコレータ記法が組み合わさり、可読性が高めです。

また、Pydanticというライブラリと連携して入力データをバリデーションできる点も見逃せません。 フォームやJSONなどから受け取ったデータを、型に基づいて自動チェックする仕組みを導入しやすいです。 そのため、実務の現場でもエラーを早期に見つけられる傾向があります。

FastAPIはASGIに対応しています。ASGIは非同期サーバーゲートウェイインターフェイスの略称であり、同期・非同期の両方に対応した仕組みと考えられます。これにより同時接続に対して柔軟に対応できます。

Webアプリケーション作成の流れ

ここからは、FastAPIを使ったWebアプリケーションの作り方を順番に見ていきましょう。 実務での流れを意識しながらポイントを整理します。 具体的なプログラム例は後ほど紹介しますので、まずは全体像をざっくり理解するところから始めるのがいいでしょう。

要件整理

どんな機能が必要か、ユーザーからどのようなリクエストを想定するかを洗い出します。

ディレクトリ構成の検討

コードをわかりやすく整理するために、パッケージ構成を考えます。

APIエンドポイントの設計

どのURLにアクセスしたらどんな処理を行うのか、HTTPメソッドを含めて決めていきます。

コードの実装

次の見出しで示すように、実際にFastAPIの機能を使ったコードを書きます。

動作チェックとデバッグ

期待どおりにAPIが動くか、エラーはないかなどをブラウザやAPIツールで確認します。

デプロイ

本番環境にアプリケーションを配置し、実際にユーザーがアクセスできるようにします。

この流れは、ほかのWebフレームワークでも共通する部分が多いです。 ただ、FastAPI固有のポイントとしては、開発途中でも自動生成されるAPIドキュメントを確認しやすいことがあげられます。

必要な環境と準備

FastAPIを使うためには、Pythonがインストールされていることが前提になります。 そのうえで、pipなどのパッケージマネージャーを利用してFastAPI本体と、非同期サーバーのuvicornなどをインストールするとよいでしょう。

多くの方はターミナルやコマンドプロンプトで次のように入力することで、環境が整います。

pip install fastapi uvicorn

ほかのライブラリを後で追加する場合は、同じようにpipやvenv、または仮想環境管理ツールを利用すると混乱しにくいです。 大規模なアプリケーションになってくると、開発環境を分けて複数人で協力しながら作るケースもあります。

FastAPI基本の書き方

次は簡単なサンプルを用意して、FastAPIのコードがどのように書けるかを確認します。

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Hello FastAPI"}

@app.get("/items/{item_id}")
def read_item(item_id: int):
    return {"item_id": item_id, "description": "This is a sample item."}

初めて見る方でも、ある程度は意図を想像しやすいかもしれません。 デコレータの@app.get("/")は、HTTPのGETメソッドでルートURLにアクセスしたとき、この関数が処理を担当すると明示しています。 同様に@app.get("/items/{item_id}")では、可変部分である{item_id}を受け取り、その値を活用する仕組みになっています。

ここで定義したread_root関数とread_item関数の戻り値は辞書形式ですが、実際にはJSON形式として返される形になります。 また、関数の引数に型情報を付けると、APIドキュメントに型情報が反映される点にも注目です。

ルーティングやリクエストの扱い方

Webアプリケーションの開発では、リクエストの内容を受け取って処理したり、レスポンスを生成する仕組みが大切です。 FastAPIでは関数引数にタイプヒントをつけることで、データのバリデーションなどが自動的に行われることも特徴の一つです。

HTTPメソッドの使い方

FastAPIのルーティングでは、@app.post(), @app.put(), @app.delete()なども使用します。 たとえば、データの新規登録を行う場合には@app.post()を使うパターンが多いでしょう。

from fastapi import FastAPI

app = FastAPI()

@app.post("/create-item")
def create_item(name: str, price: float):
    return {"name": name, "price": price, "status": "created"}

このようにすることで、/create-itemに対してPOSTリクエストを送ったときに、関数の引数としてnamepriceを受け取り、そのままJSONにして返す形にしています。 上の例では価格の情報をfloat型にしておくことで、文字列として送信された場合にはエラーを返すなどの動きが期待できます。

JSONレスポンスとリクエストボディ

FastAPIは、標準でJSON形式のやり取りを前提とする設計です。 フォームやクエリパラメータ、パスパラメータなど、さまざまな入力方法に対してバリデーションを実施できます。

多くの初心者の方は、リクエストボディの扱いを誤ってエラーに遭遇しがちです。型指定が合わない場合や、JSONの構造が一致しない場合はエラーを返す可能性がありますが、すぐに修正点がわかるので問題追及はしやすいでしょう。

たとえばPydanticのモデルを使うと、より複雑なデータ構造でも扱いやすくなります。 下のサンプルでは、リクエストボディに複数の項目がある場合を仮定します。

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    name: str
    price: float
    in_stock: bool

@app.post("/items")
def create_item(item: Item):
    return {"message": "Item created successfully", "item": item}

Itemクラスに含まれるデータがJSONで正しく送られてくると、自動的に整合性がチェックされ、連携できるようになります。 このように、コードに型定義を入れておくだけで、データの受け渡しの安全性が高まりやすいです。

実務で使える応用例

業務システムや、外部サービスと連携するようなAPI開発にFastAPIを導入することがあります。 まだ大規模な構成にはならないものの、実際のプロジェクトでは認証やデータベース連携も必要になってくるでしょう。 ここでは、その一端をイメージしやすいようにざっくり説明していきます。

シンプルな認証の導入イメージ

エンドポイントを保護する方法としては、トークン認証やOAuthなどが取り入れられることが多いです。 FastAPIではOAuth2周りの仕組みが利用しやすいため、セキュアなログイン機能を追加しやすいと感じるかもしれません。 特に、APIを外部公開するときには認証を設定しないと、誰でもアクセスできる状態になるリスクがあります。

from fastapi import FastAPI, Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer

app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

def verify_token(token: str = Depends(oauth2_scheme)):
    # ここではトークンの検証を行うイメージ
    if token != "sampletoken123":
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Invalid token",
        )
    return token

@app.get("/protected")
def protected_endpoint(token: str = Depends(verify_token)):
    return {"message": "You have accessed a protected endpoint."}

ここでは簡単な例として、token != "sampletoken123"であれば拒否すると設定しています。 実運用ではデータベースとの照合や複雑なロジックが入るでしょうが、概念としてはこのように書くことが多いです。

データベース連携

FastAPIのアプリをデータベースとつなぐ場合、ORM(Object-Relational Mapping)ツールをよく使います。 PythonではSQLAlchemyが代表的であり、FastAPIとの相性も良いとされています。

from fastapi import FastAPI
from pydantic import BaseModel
from typing import Optional
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker, declarative_base

app = FastAPI()
Base = declarative_base()

class UserTable(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True, index=True)
    username = Column(String, unique=True, index=True)

DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base.metadata.create_all(bind=engine)

class User(BaseModel):
    id: Optional[int]
    username: str

@app.post("/users")
def create_user(user: User):
    db = SessionLocal()
    new_user = UserTable(username=user.username)
    db.add(new_user)
    db.commit()
    db.refresh(new_user)
    return {"message": "User created", "user": {"id": new_user.id, "username": new_user.username}}

この例ではSQLiteを使い、ユーザー情報を保存するテーブルを用意しています。 関数内でSessionLocal()を呼び出すことでデータベース操作ができ、commit()で情報を確定させています。

実務では、接続プールの管理やトランザクションの扱いなど、もう少し複雑な設定を加えるかもしれません。 ただ、基本的にはこのような流れでFastAPIとデータベースを連携できると考えられます。

テストの考え方

本番運用を視野に入れるなら、アプリケーションが正しく動くかどうかのテストは欠かせません。 FastAPIではTestClientという仕組みを提供していて、APIのエンドポイントに対してテストを行いやすいです。 これにより、作ったエンドポイントが意図したレスポンスを返すかどうかを確認できます。

from fastapi import FastAPI
from fastapi.testclient import TestClient

app = FastAPI()

@app.get("/ping")
def ping():
    return {"message": "pong"}

client = TestClient(app)

def test_ping():
    response = client.get("/ping")
    assert response.status_code == 200
    assert response.json() == {"message": "pong"}

このように書いておけば、pytestなどを使って実行したときに問題の有無がすぐにわかるはずです。 テストのレベルを上げていくと、認証やデータベース連携のチェック、例外処理の挙動なども網羅していくことになります。

まとめ

ここまで、FastAPIを使ったWebアプリケーション開発の基本的な流れや具体例を紹介してきました。 フレームワークとしての軽量さやコードのわかりやすさ、さらに自動生成されるAPIドキュメントによって、初心者でも開発プロセスを把握しやすいのではないでしょうか。 実際の業務では認証やデータベースの活用、テストコードの充実など、さまざまな要素と組み合わせる場面が多くなると考えられます。

Pythonを使ったWebアプリケーション開発を始めるうえで、FlaskやDjangoとあわせて比較しつつFastAPIを選ぶのも良い方法かもしれません。 まずは小さなAPIから取り掛かって、少しずつ機能を拡張していくと、初心者の方でもステップを踏んで学ぶことができるでしょう。 以上を参考に、ぜひFastAPIによるバックエンド開発に取り組んでみてください。

Pythonをマスターしよう

この記事で学んだPythonの知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。