開発・技術選定

Django と Next.js のハイブリッド構成 — どちらで何を描くかの線引き

「全部 Next.js」でも「全部 Django」でもなく、
画面の性質ごとに分ける構成を採るケースが増えました。実際の線引きです。

線引きの実例

画面 担当 理由
LP・記事・お問い合わせ Django(テンプレート) 更新が少ない。ビルド不要で直せる
会員向けの動的画面 Next.js 状態が複雑。操作が多い
管理画面 Django admin ベース 作り込むより既存を活かす

判断の軸は 「誰がどのくらいの頻度で直すか」 です。
文言修正が多いページをビルド必須にすると、運用が確実に詰まります。

URL の振り分け

同一ドメインで、リバースプロキシがパスで振り分けます。

location /app/ { proxy_pass http://nextjs; }   # 会員向け
location /     { proxy_pass http://django; }   # それ以外

同一ドメインなので CORS の設定が要らず、Cookie もそのまま共有できます。
この一点だけで、認証まわりの設計が大幅に単純になります。

認証の共有

Django のセッション Cookie を Next.js 側からも使います。
Next.js のサーバー側で Django に問い合わせて、ログイン状態を確認します。

// サーバーサイドで実行(Cookie をそのまま転送する)
const res = await fetch(`${API}/api/me/`, {
  headers: { cookie: req.headers.cookie ?? "" },
});
if (res.status === 401) return { redirect: { destination: "/login" } };

トークンを新たに発行しないのが要点です。
発行すると失効管理を二重に持つことになり、事故の温床になります。

運用して分かった注意点

1. 静的ファイルのパスが衝突する

両方が /static/ を使おうとして事故ります。
Next.js 側は assetPrefix を分けておきます。

2. エラーページが2種類になる

404 のデザインが Django と Next.js で違うと、体験がちぐはぐになります。
どちらかに寄せるか、同じHTMLを共有する必要があります。

3. デプロイ順序

API を先に更新すると、古いフロントが壊れることがあります。
後方互換を保ったままAPIを出し、フロントを後からという順序に固定します。

4. ログが分断される

前段の Nginx で相関IDを発行し、両方に渡すようにしました。

proxy_set_header X-Request-ID $request_id;

この構成が向かないケース

  • チームが1人で、画面数も少ない → Django だけで十分
  • 全画面が高度に動的 → 全部 Next.js のほうが単純

中途半端な規模でこそ効く構成です。

まとめ

  • 「誰がどの頻度で直すか」で担当を決める
  • 同一ドメインにして CORS と二重認証を避ける
  • 静的パス・エラーページ・デプロイ順序・ログの4点が実運用の落とし穴