Django REST API で提供するデータを Next.js で取得・表示する方法について解説します。
前回の記事では、Django REST Framework(DRF)を利用して、コサイン類似度を用いたおすすめ記事 API を実装しました。
今回は、その API を Next.js でどのように利用し、フロントエンドにデータを表示するかを解説します。
Next.js では、fetch
を使って Django の API からデータを取得し、記事ページを動的に生成します。
今回は ISR(Incremental Static Regeneration)を採用し、適度なキャッシュを利用してパフォーマンスを最適化します。
以下のコードでは、Django の API から記事データを取得し、ISR を適用して 24 時間ごとに再検証するように設定しています。
JAVASCRIPTconst res = await fetch(`${process.env.BACKEND_URL}/api/posts/${slug}/`, { next: { revalidate: 86400, tags: [slug, "categories", "themes"] }, // 24時間キャッシュ });
next.revalidate: 86400
により、1 日ごとにデータを更新 し、API の負荷を軽減しつつ、一定時間ごとに最新データが反映されるようになります。
リアルタイムで常に最新データを取得したい場合は、cache: "no-store"
を使用することで、毎回 API から最新のデータを取得できます。
JAVASCRIPTconst res = await fetch(`${process.env.BACKEND_URL}/api/posts/${slug}/`, { cache: "no-store", // キャッシュを無効化し、常に最新データを取得 });
この方式を採用すると、サーバー負荷が高くなるため、更新頻度やサーバーリソースを考慮して選択するのが重要です。
Next.js で API から取得したデータを記事ページとして表示するコードは以下のようになります。
app/posts/[slug]/page.js
JAVASCRIPTimport { notFound } from "next/navigation"; import PostDetail from "@/components/posts/PostDetail"; import { metadata } from "@/app/layout"; import { fetchPostData } from "@/utils/api"; export default async function PostPage({ params }) { const post = await fetchPostData(params.slug); if (!post) return notFound(); return <PostDetail post={post} />; }
記事が見つからない場合は notFound()
を返し、PostDetail
コンポーネントで記事を表示するシンプルな構成になっています。
記事の詳細ページでは、関連記事のリストを表示するため、おすすめ記事 API を利用します。
Recommendation.js
JAVASCRIPT"use client"; import Link from "next/link"; import { useState, useEffect } from "react"; const Recommendation = ({ slug }) => { const [recommendations, setRecommendations] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { async function fetchRecommendations() { try { const res = await fetch( `${process.env.BACKEND_URL}/recommend/${slug}/` ); if (res.ok) { const data = await res.json(); setRecommendations(data); } } catch (error) { console.error("Error fetching recommendations:", error); } finally { setLoading(false); } } fetchRecommendations(); }, [slug]); if (loading) return <p>読み込み中...</p>; return ( <div> <h3>おすすめ記事</h3> <ul> {recommendations?.map((rec) => ( <li key={rec.slug}> <Link href={`/posts/${rec.slug}`}>{rec.title}</Link> </li> ))} </ul> </div> ); }; export default Recommendation;
今回は、Django REST Framework の API を Next.js で活用する方法 を解説しました。
回 | タイトル | リンク |
---|---|---|
第 1 回 | ブログ設計図の概要 | 詳 細 |
第 2 回 | .md ファイルの取込みと JSON 化の概要 | 詳 細 |
第 3 回 | Embedding API を活用した類似記事推薦 | 詳 細 |
第 4 回 | Next.js による推薦記事 API の活用 | この記事 |
第 5 回 | Post モデルの設計と Markdownx の適用 | 詳 細 |
第 6 回 | Django 画像アップロード時の画像処理 | 詳 細 |
第 7 回 | Markdownx で画像をアップロード | 詳 細 |
第 8 回 | 多様な記事推薦システムの導入 | 詳 細 |
第 9 回 | 自動クラスタリング vs. 手動分類 | 詳 細 |
第 10 回 | 「公開・非公開」管理機能の実装 | 詳 細 |
当サイトの情報は、一般的な参考情報として提供しております。
正確な情報の掲載に努めておりますが、その内容の正確性・完全性・最新性を保証するものではありません。
記事の内容をご利用の際は、ご自身の責任において判断し、必要に応じて専門家にご相談ください。
当サイトの情報の利用により生じたいかなる損害についても、一切の責任を負いかねますのでご了承ください。
※ 本ページでは、著作権法に基づき、適正な引用の範囲内でコンテンツを紹介しています。
オリジナルの情報は発信元をご確認ください。
もし問題がありましたら、こちら からお問い合わせください。