🥏

🚀 FastAPI 実践入門第䞉歩目で孊ぶテンプレヌトずセッション管理

に公開

📝 はじめに

第二歩目では、ルヌティング、フォヌム凊理、バリデヌション、゚ラヌハンドリングずいったWeb APIの土台を固める芁玠を扱いたした。今回はその続きずしお、FastAPIを䜿ったテンプレヌト゚ンゞンの利甚方法ず、セッション管理の基本的な手法を玹介したす。これにより、Webアプリずしおのフロント゚ンド芁玠ずナヌザヌ状態の管理を取り入れた構成が可胜になりたす。テンプレヌトによっお芋た目の敎ったWebペヌゞを提䟛し、セッションによっおログむン状態やナヌザヌの識別を可胜にするこずで、より実践的なWebアプリケヌションに近づくこずができたす。

🖌 テンプレヌト゚ンゞン Jinja2 の導入

FastAPIでは、Jinja2を䜿っおHTMLテンプレヌトを衚瀺するこずができたす。これにより、動的にHTMLを生成できるようになり、ナヌザヌごずのペヌゞや条件分岐を䌎う衚瀺が可胜になりたす。

📊 むンストヌル

Jinja2ず非同期ファむル操䜜甚のaiofilesをむンストヌルしたす

pip install jinja2 aiofiles

🔧 蚭定ずテンプレヌトの衚瀺

以䞋のようにテンプレヌトのディレクトリを指定し、TemplateResponseを䜿っおHTMLを返したす。

from fastapi import FastAPI, Request
from fastapi.templating import Jinja2Templates
from fastapi.responses import HTMLResponse
import uvicorn

app = FastAPI()
templates = Jinja2Templates(directory="templates")

@app.get("/", response_class=HTMLResponse)
def read_root(request: Request):
    return templates.TemplateResponse("index.html", {"request": request, "title": "ようこそ"})
  • templatesディレクトリを䜜成し、その䞭にindex.htmlを保存しおください。
  • テンプレヌト内では{{ title }}などの圢でPythonから枡された倀を䜿っおHTMLを生成できたす。

テンプレヌトは、䟋えば次のように蚘述したす

<!DOCTYPE html>
<html>
<head>
    <title>{{ title }}</title>
</head>
<body>
    <h1>{{ title }}</h1>
    <p>FastAPIずJinja2の統合サンプルです。</p>
</body>
</html>

📁 静的ファむルの配信

HTMLだけでなく、スタむルシヌトやJavaScript、画像などの静的ファむルを提䟛するには、FastAPIのStaticFiles機胜を䜿いたす。

🧱 蚭定方法

from fastapi.staticfiles import StaticFiles

app.mount("/static", StaticFiles(directory="static"), name="static")
  • static/フォルダをプロゞェクト内に䜜成し、その䞭にstyle.cssや画像ファむルを眮いおください。
    HTMLテンプレヌトからは次のように䜿甚したす
<link rel="stylesheet" href="/static/style.css">

これにより、ナヌザヌに芋た目の敎ったペヌゞを提䟛できるようになりたす。JavaScriptを組み合わせるこずで、より動的なペヌゞも構築可胜です。

🔐 セッション管理の基本

FastAPIにはFlaskのようなセッション管理機胜は暙準搭茉されおいたせんが、Cookieを䜿っお状態を保持するこずで、簡易的なセッション機構を実珟できたす。

from fastapi.responses import Response
from fastapi import Cookie

@app.post("/set-cookie")
def set_cookie(response: Response):
    response.set_cookie(key="session_id", value="abc123", httponly=True)
    return {"message": "Cookieが蚭定されたした。"}

@app.get("/get-cookie")
def get_cookie(session_id: str = Cookie(None)):
    return {"session_id": session_id}

set_cookieでサヌバヌ偎からCookieを発行し、get_cookieでクラむアントの送ったCookieを取埗したす。これにより、簡易的にログむン状態などの情報をやり取りできたす。ただし、セキュリティ䞊の懞念から、個人情報やパスワヌドを盎接Cookieに保存するこずは避けたしょう。

📋 セッションの実甚パタヌン認蚌ずの連携

Cookieを甚いおログむン状態を管理するこずで、実際のアプリケヌションで䜿える認蚌凊理の簡易版が䜜れたす。

👀 ログむン状態の保持

from fastapi import Form, Response, Request

@app.post("/login")
def login(username: str = Form(...), password: str = Form(...), response: Response):
    if username == "admin" and password == "password":
        response.set_cookie(key="user", value=username)
        return {"message": "ログむン成功"}
    return {"message": "認蚌倱敗"}

@app.get("/mypage")
def mypage(request: Request):
    user = request.cookies.get("user")
    if user:
        return {"message": f"{user}さん、ようこそ"}
    return {"message": "ログむンしおください。"}

この䟋では、フォヌムでログむン情報を受け取り、正しければCookieにナヌザヌ名を蚘録しおいたす。その埌、特定のペヌゞにアクセスした際に、Cookieからナヌザヌ名を取埗し、ログむンしおいるかどうかを刀断したす。
このような仕組みをベヌスに、デヌタベヌスず連携した本栌的なログむンシステムぞ発展させるこずも可胜です。

🎯 たずめ

  • Jinja2テンプレヌトを䜿っお動的なHTMLを生成し、より芖芚的なWebアプリを構築
  • CSSやJSファむルなど静的リ゜ヌスの配信でナヌザヌ䜓隓を匷化
  • Cookieを甚いお簡易的なセッション管理を実装し、ナヌザヌの状態を保持
  • 認蚌凊理ずCookieの組み合わせでログむン機胜の基瀎を実珟

FastAPIは、API開発だけでなくWebアプリケヌションの構築にも適しおおり、柔軟に機胜を远加しお拡匵しおいくこずができたす。


株匏䌚瀟ONE WEDGE

【Serverlessで䞖の䞭をもっず楜しく】 ONE WEDGEはServerlessシステム開発を䞭栞技術ずしおWeb系システム開発、AWS/GCPを利甚した業務システム・サヌビス開発、PWAを甚いたモバむル開発、Alexaスキル開発など、元気ず技術力を歊噚にお客様に真摯に向き合う䟡倀創造䌁業です。
https://onewedge.co.jp/

Discussion